时间离开害羞模式,并在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 秒
谢谢大家的阅读。
ħ
答案 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)
很少有解决方案浮现在脑海中,但我认为他们不会取悦你......
这真的是个问题吗?是的,它很慢,数据库更新可以更快。但是,如果你可以将它作为后台进程(异步),那么无论如何你都会得到你的数字。它真的是“我一旦点击或业务将会下降,我需要在下一秒内获得此数字吗?”
这可能是放弃2013年的原因。在CRM 2015中,您可以使用calculated field。如果您只需要将这些数字显示在表单中(例如,您不在报告中使用它们),您也可以在javascript中执行此操作。
警告这是针对desesperate呼叫。如果你真的需要你的更新同步,立即,你不能使用计算字段,你真的知道你在做什么等...为什么不直接在数据库中做?我知道这是一个非常糟糕的建议。有很多理由不这样做(你可以阅读a few here)。这是不受支持的,如果你做错了,它可能会非常糟糕。但是如果你的真实情况和你的例子一样简单(只是一个计算字段,没有实体创建,没有关系修改),你可以这样做。你将不得不考虑很多事情:你不会对这些领域进行任何审计,没有安全性,缓存问题,没有修改等等。实际上我非常反对这个解决方案。
答案 2 :(得分:0)
1 - 将此逻辑用于异步工作流程。
要么
2 - 不要使用
serviceContext.UpdateObject(ENTA);
serviceContext.SaveChanges();
从后期获取所有记录(150)更新字段和ExecuteMultipleRequest以一次更新crm记录。 不要为每条记录发送更新请求