问题描述
下面是'实体A'中的数据
记录 1 的字段值
- 价格 = 100
- 数量 = 4
记录 2 的字段值
- 价格 = 200
- 数量 = 2
我需要添加字段的值并在新记录中更新它。示例如下所示 -
记录 3
- 价格 = 100 + 200 = 300
- 数量 = 4 + 2 = 6
实体 A 有一个名为“Perform Addition”的按钮,点击后会触发插件代码。
我需要一些关于如何实现这一点的想法/伪代码。上面解释的示例只是我的实体的一个更简单的版本。在 Real 中,实体上有 60 多个字段,对于每个字段,我需要在第三个字段中执行求和和更新。此外,将对其执行添加的记录数可以超过 2。
因此,记录数越多,我就越需要遍历每条记录并执行求和,我想知道是否有更简单更好的方法来编写此逻辑。
只需要有关如何编写逻辑的指导。 任何帮助将不胜感激。
解决方案:
尝试了下面的代码,它按照答案的建议工作 -
AttributeList 是我需要对其进行求和的字段列表。所有字段均为十进制
Entity EntityA = new EntityA();
EntityA.Id = new Guid({"Guid String"});
var sourceEntityDataList = service.RetrieveMultiple(new FetchExpression(fetchXml)).Entities;
foreach (var value in AttributeList)
{
EntityA[value]= sourceEntityDataList.Sum(e => e.Contains(value) ? e.GetAttributeValue<Decimal>(value) : 0);
}
service.Update(EntityA);
解决方法
我最近为一位客户做了类似的事情。我们曾考虑使用汇总字段,但他们希望在 12 小时内获得结果。
包含我们求和的值的记录是子记录,包含结果的记录是父记录。
它的工作方式是:
- 从插件的目标实体中,获取父 ID。
- 检索父级。
- 检索其子项(通过 LINQ、FetchXML 或 QueryExpression)。
- 总结孩子们的价值观。由于您有很多字段要求和,您可以创建一个字段名称列表,然后使用这样的方法(假设它们都是
Money
字段)private decimal sum(string field) => Records.Sum(b => b.GetAttributeValue<Money>(field)?.Value ?? 0);
如果字段类型不同,您还可以创建不同的sum
方法,例如sumMoney
、sumInt
等。然后您需要按类型分隔字段并将它们传递给相应的方法. - 在父级
Entity
上填充结果。 - 在 Dynamics 中更新父记录。
如果信息对时间不敏感,可以查看开箱即用的汇总字段。