我有以下要求要在实体上的插件代码中实现,比如"实体a"-
以下是"实体A"中的数据
用字段值记录1
- 价格=100
- 数量=4
用字段值记录2
- 价格=200
- 数量=2
我需要做两件事
- 添加字段值并在新记录中更新
- 将加法公式存储在其他配置实体中
以下示例-
记录3
-
价格
价格=300公式值=100+200 -
数量数量值=6公式值=4+2
实体A有一个名为";执行加法";一旦点击,就会触发插件代码。
下面是我尝试过的代码-
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);
我想知道是否有一种方法可以通过linq存储公式而不循环?如果没有,我怎么能做到这一点?
如有任何帮助,我们将不胜感激。
以下是一些想法:
有趣的是,您正在从多个记录中计算值,并将结果填充到兄弟记录而不是父记录中。这不同于典型的";"汇总";计算
Dynamics使用SQL顺序GUID生成器来生成其ID。如果您在Dynamics之外生成GUID,您可能需要考虑利用相同的逻辑。
以下是如何使用LINQ重构代码的示例:
var target = new Entity("entitya", new Guid("guid"));
var entities = service.RetrieveMultiple(new FetchExpression(fetchXml)).Entities.ToList();
attributes.ForEach(a => target[a] = entities.Sum(e => e.GetAttributeValue<Decimal>(a));
service.Update(target);
GetAttributeValue<Decimal>()
方法默认为0,因此我们可以跳过Contains
调用。
就将公式存储在配置实体上而言,如果您正在寻找存储和使用任何公式的能力,您将需要一个完整的表达式解析器,就像这个计算器示例一样。你是否能够在沙盒插件中完成反射是另一个问题。
但是,如果您有几个集合公式,您可以将它们全部编码到插件中,并根据实体的属性和/或配置数据确定在运行时使用哪个。