Dynamics crm + 用于在实体集合中存储求和公式的插件代码
Dynamics crm + Plugin code to store sum formula across a entity collection
我有以下要求在实体的插件代码中实现,比如 'Entity A'-
下面是'Entity 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,您可能需要查看 leveraging the same logic.
下面是您可以如何使用 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>()
方法defaults为0,所以我们可以跳过Contains
调用。
就将公式存储在配置实体上而言,如果您正在寻找存储和使用任何公式的能力,您将需要一个完整的表达式解析器,按照此 calculator example.
您是否能够在沙盒插件中执行所需的反射是另一个问题。
但是,如果您有一些固定公式,您可以将它们全部编码到插件中,并根据实体的属性 and/or 配置数据确定在运行时使用哪个。
我有以下要求在实体的插件代码中实现,比如 'Entity A'-
下面是'Entity 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,您可能需要查看 leveraging the same logic.
下面是您可以如何使用 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>()
方法defaults为0,所以我们可以跳过Contains
调用。
就将公式存储在配置实体上而言,如果您正在寻找存储和使用任何公式的能力,您将需要一个完整的表达式解析器,按照此 calculator example. 您是否能够在沙盒插件中执行所需的反射是另一个问题。
但是,如果您有一些固定公式,您可以将它们全部编码到插件中,并根据实体的属性 and/or 配置数据确定在运行时使用哪个。