Microsoft Dynamics CRM 2013/2015插件性能



是时候离开害羞模式,在stackoverflow上发表我的第一篇文章了。在做了大量的研究(插件,性能,索引,更新类型,朋友)和尝试了几种方法后,我无法找到一个合适的答案/解决方案。

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

场景:

Microsoft Dynamics CRM 2013/20152关系为1的实体:N
EntityA
EntityB

EntityB有以下列:
Id | EntityAId | ColumnDemoX (decimal) | ColumnDemoY (currency)

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

目的:


创建Post Entity插件更新以"模仿"以下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 在post插件更新中将花费20秒或更多

Set ColumnDemoX = (some quantity), ColumnDemoY = (some quantity) * (some value) Where EntityAId = (some id)
0.00001需要

任何建议/解决方案吗?


感谢大家的阅读。
H

您可以使用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. 这真的是个问题吗?是的,它很慢,数据库更新可以快得多。然而,如果你可以将其作为后台进程(异步),你将拥有你的数字。这真的是一个"我需要这些数字在接下来的一秒内,一旦我点击或业务将下降"的情况吗?

  2. 这可能是放弃2013年的一个理由。在CRM 2015中,您可以使用计算字段。如果你需要这些数字只显示在表格中(如。

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

1 -将此逻辑置于异步工作流中。或2 -不要使用
serviceContext.UpdateObject (entA);

serviceContext.SaveChanges();。

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

最新更新