2

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

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

设想:

Microsoft Dynamics CRM 2013/2015
2 具有关系 1:N
EntityA
EntityB的实体

EntityB 具有以下列:
Id | 实体 ID | 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();
}

问题:

post 插件更新中150 条记录的 foreach将需要20 秒或更长时间

更新 EntityB 设置 ColumnDemoX = (一些数量), ColumnDemoY = (一些数量) * (一些值) 其中 EntityAId = (一些 id)
它将需要0.00001

有什么建议/解决方案吗?


谢谢大家的阅读。
H

4

3 回答 3

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);
于 2015-06-04T14:18:03.867 回答
0

想到的解决方案很少,但我认为它们不会让您满意...

  1. 这真的是个问题吗?是的,它很慢,而且数据库更新可以快得多。但是,如果您可以将其作为后台进程(异步),那么无论如何您都会拥有您的号码。真的是“我一点击就下一秒需要这个数字,否则生意会倒闭”的情况吗?

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

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

于 2015-06-08T08:06:55.677 回答
0

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

服务上下文.SaveChanges();。

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

于 2015-06-17T08:47:26.163 回答