是时候离开害羞模式,在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);
我想到了几个解决方案,但我认为它们不会让你满意…
-
这真的是个问题吗?是的,它很慢,数据库更新可以快得多。然而,如果你可以将其作为后台进程(异步),你将拥有你的数字。这真的是一个"我需要这些数字在接下来的一秒内,一旦我点击或业务将下降"的情况吗?
-
这可能是放弃2013年的一个理由。在CRM 2015中,您可以使用计算字段。如果你需要这些数字只显示在表格中(如。
-
警告这是绝望呼叫。如果你真的需要你的更新是同步的,即时的,你不能使用计算字段,你真的知道你在做什么…为什么不直接在数据库中进行呢?我知道这是个很糟糕的建议。有很多理由不这样做(你可以在这里读到一些)。它是不受支持的,如果你做错了什么,它可能会变得非常糟糕。但是,如果您的实际情况与示例一样简单(只有一个计算字段,不创建实体,不修改关系),则可以这样做。您将不得不考虑很多事情:您不会对字段进行任何审计,没有安全性、缓存问题,没有被修改,等等。实际上,我非常反对这种解决方案。
1 -将此逻辑置于异步工作流中。或2 -不要使用
serviceContext.UpdateObject (entA);
serviceContext.SaveChanges();。
从后期阶段获取所有记录(150),更新字段和executemmultiplerequest以一次更新crm记录。不要为每条记录发送更新请求