我需要从外部表更新CRM数据。一切正常但很慢。这是我的代码:
static void Main(string[] args)
{
var dbClient = new CollectionEntities(); //Get database Entities
using(var xrm = new XrmServiceContext("Xrm"); // Get CRM Entities
{
foreach (var row in dbClient.Client) //Reading rows from database
{
var c = (from a in crm.new_clientSet where a.new_Idnumber == row.Client_ID select a).FirstOrDefault(); // IS there clint with id from database
if (c == null)// if client not exist i create new if exists I update data
{
c = new new_client { new_Idnumber = row.Client_ID };
crm.AddObject(c);
}
c.new_name = row.Client_name; //[Client_name]
c.new_Idnumber = row.Client_ID;//[Client_ID]
c.EmailAddress = row.Email;//[Email]
xrm.AddObject(c);
xrm.SaveChanges();
}
}
}
有了这个,我可以在CRM中插入和更新数据,但速度很慢。有没有办法用这个Parallel.ForEach方法或其他方法来加速这个?谢谢!
答案 0 :(得分:0)
您正在每个循环中从CRM加载一行。这使你的应用程序非常“健谈”#34;它在网络开销上花费的时间比加载数据要多。尝试在循环之前使用单个查询将整个CRM数据集加载到内存中。然后,在循环中,从内存中查找记录而不是查询CRM。如果您有大型数据集,则可能需要使用分页cookie。
答案 1 :(得分:0)
查看Microsoft的Premier Field Engineering - Dynamics团队的开源PFE Core Library for Dyanmics CRM库。它为您处理并行性。 Parallel Common Request示例页面显示了并行更新一堆记录是多么容易:
public void ParallelUpdate(List<Entity> targets)
{
try
{
this.Manager.ParallelProxy.Update(targets);
}
catch (AggregateException ae)
{
// Handle exceptions
}
}
您还可以使用它来查询大型数据集......它将处理为您检索所有内容。
答案 2 :(得分:0)
在这种情况下肯定是ExecuteMultipleRequest。
不同之处在于,您将发送一个请求,这样您就不会有网络开销,并且所有插入内容都将在服务器端由CRM处理,更快。