Microsoft Dynamics CRM 2013/2015中的插件性能

时间:2015-06-04 11:14:12

标签: performance plugins dynamics-crm dynamics-crm-2013 dynamics-crm-2015

时间离开害羞模式,并在stackoverflow上发表我的第一篇文章。 在完成大量研究(插件,性能,索引,更新类型,朋友)之后,在尝试了几种方法之后,我无法找到正确的答案/解决方案。

因此,如果可能的话,我希望得到您对Microsoft Dynamics CRM 2013/2015插件性能问题(或编码技术)的反馈/帮助

情景:

Microsoft Dynamics CRM 2013/2015
2关系1的实体:N
实体A
实体B

EntityB具有以下列:
Id | EntityAId | ColumnDemoX(十进制)| ColumnDemoY(货币)

实体A有:500条记录
实体B具有:每个实体A记录150个记录。所以500 * 150 = 75000条记录。

目的:

创建一个Post Entity A Plugin Update以“模仿”以下SQL命令

Update EntityB
Set ColumnDemoX = (some quantity), ColumnDemoY = (some quantity) * (some value)
Where EntityAId = (some id)

一种方法可能是:

using (var serviceContext = new XrmServiceContext(service)) 
{
  var query = from a in serviceContext.EntityASet
              where a.EntityAId.Equals(someId)
              select a;

  foreach (EntityA entA in query)
  {
    entA.ColumnDemoX = (some quantity);
    serviceContext.UpdateObject(entA);
  }

  serviceContext.SaveChanges();
}

问题:

在帖子插件更新中 150条记录 的foreach将花费 20秒或更多
而中 更新实体B设置ColumnDemoX =(某些数量),ColumnDemoY =(某些数量)*(某个值)其中EntityAId =(某个ID)
它将需要 0.00001

任何建议/解决方案?


谢谢大家的阅读。
ħ

3 个答案:

答案 0 :(得分:1)

您可以使用ExecuteMultipleRequest,在迭代150个实体时,保存需要更新的实体,然后再调用请求。如果你这样做,你只需要拨打一次服务,这对于性能非常好。

如果您的流程可能越做越大,那么您应该考虑将其作为插件或自定义活动工作流进行异步。

这是一个例子:

// Create an ExecuteMultipleRequest object.
requestWithResults = new ExecuteMultipleRequest()
{
    // Assign settings that define execution behavior: continue on error, return responses. 
    Settings = new ExecuteMultipleSettings()
    {
        ContinueOnError = false,
        ReturnResponses = true
    },
    // Create an empty organization request collection.
    Requests = new OrganizationRequestCollection()
};

// Add a UpdateRequest for each entity to the request collection.
foreach (var entity in input.Entities)
{
    UpdateRequest updateRequest = new UpdateRequest { Target = entity };
    requestWithResults.Requests.Add(updateRequest);
}

// Execute all the requests in the request collection using a single web method call.
ExecuteMultipleResponse responseWithResults =
    (ExecuteMultipleResponse)_serviceProxy.Execute(requestWithResults);

答案 1 :(得分:0)

很少有解决方案浮现在脑海中,但我认为他们不会取悦你......

  1. 这真的是个问题吗?是的,它很慢,数据库更新可以更快。但是,如果你可以将它作为后台进程(异步),那么无论如何你都会得到你的数字。它真的是“我一旦点击或业务将会下降,我需要在下一秒内获得此数字吗?”

  2. 这可能是放弃2013年的原因。在CRM 2015中,您可以使用calculated field。如果您只需要将这些数字显示在表单中(例如,您不在报告中使用它们),您也可以在javascript中执行此操作。

  3. 警告这是针对desesperate呼叫。如果你真的需要你的更新同步,立即,你不能使用计算字段,你真的知道你在做什么等...为什么不直接在数据库中做?我知道这是一个非常糟糕的建议。有很多理由不这样做(你可以阅读a few here)。这是不受支持的,如果你做错了,它可能会非常糟糕。但是如果你的真实情况和你的例子一样简单(只是一个计算字段,没有实体创建,没有关系修改),你可以这样做。你将不得不考虑很多事情:你不会对这些领域进行任何审计,没有安全性,缓存问题,没有修改等等。实际上我非常反对这个解决方案。

答案 2 :(得分:0)

1 - 将此逻辑用于异步工作流程。 要么 2 - 不要使用
serviceContext.UpdateObject(ENTA);

serviceContext.SaveChanges();

从后期获取所有记录(150)更新字段和ExecuteMultipleRequest以一次更新crm记录。 不要为每条记录发送更新请求