Вот такой код, как бы его оптимизировать
X++:
public void StartOneByOneProcesssing()
{
int queryCount = 5000;
int pageNumber = 1;
int recordCount = 1;
Boolean hasRecords = true;
PagingInfo pagingInfo = new PagingInfo();
pagingInfo.Count = queryCount;
pagingInfo.PageNumber = pageNumber;
EntityCollection results = null;
var requestWithResults = CreateExecuteMultipleRequest();
Lead sfLead = null;
while (hasRecords)
{
try
{
// Retrieve the page.
swXrm.Start();
results = _xrmLeadService.GetByQueryExpression(GetQueryExpression(queryCount, pageNumber, results?.PagingCookie));
swXrm.Stop();
Console.WriteLine("Elapsed XRM ={0}", swXrm.Elapsed);
swXrm.Reset();
hasRecords = results?.Entities?.Count > 0;
if (results.Entities != null)
{
var ids = results.Entities.Select(e => e.GetAttributeValue<string>("new_sfdcid")).ToArray();
swOneBuOnekSql.Start();
var sfLeads = _sfleadService.GetLeads(ids);
swOneBuOnekSql.Stop();
Console.WriteLine("Elapsed SQL One By One ={0}", swOneBuOnekSql.Elapsed);
swOneBuOnekSql.Reset();
Console.WriteLine("Page cokie = {0}", results?.PagingCookie);
swBulkSql.Start();
foreach (var xrmLead in results.Entities)
{
try
{
var sfdcid = xrmLead.GetAttributeValue<string>("new_sfdcid");
sfLead = sfLeads.FirstOrDefault(e => e != null && e?.Id == sfdcid);
if(sfLead != null)
{
Entity updatedXrmLead = _leadMapping.Create(xrmLead, sfLead);
UpdateRequest update = new UpdateRequest { Target = updatedXrmLead };
requestWithResults.Requests.Add(update);
_userService.AssignLead(sfLead, updatedXrmLead.Id, xrmLead.GetAttributeValue<EntityReference>("ownerid")?.Id);
} else
{
_logger.WriteUpdateLog(new UpdateLog("lead", sfLead?.Email ?? xrmLead.GetAttributeValue<string>("emailaddress1"), "not found in sql", sfLead?.Id ?? xrmLead.GetAttributeValue<string>("new_sfdcid")));
}
if(requestWithResults.Requests.Count == 1000)
{
Stopwatch OneThousandRecords = new Stopwatch();
OneThousandRecords.Start();
var responseWithResults = _xrmLeadService.ExecuteMultipleRequest(requestWithResults);
OneThousandRecords.Stop();
Console.WriteLine($"1000 processed in {OneThousandRecords.Elapsed}");
//foreach (var responseItem in responseWithResults.Responses)
//{
// // An error has occurred.
// if (responseItem.Fault != null)
// DisplayFault(requestWithResults.Requests[responseItem.RequestIndex],
// responseItem.RequestIndex, responseItem.Fault);
//}
requestWithResults.Requests.Clear();
}
}
catch (Exception ex)
{
var sb = ParseError(ex);
_logger.WriteErrorLog(new ErrorLog("lead", sfLead?.Email, sb.ToString(), sfLead?.Id));
}
}
recordCount += queryCount;
}
swOneBuOnekSql.Stop();
Console.WriteLine($"Fetching page {pageNumber} and total leads processed {recordCount} in {swOneBuOnekSql.Elapsed}");
swOneBuOnekSql.Reset();
pageNumber++;
}
catch (Exception ex)
{
hasRecords = false;
Console.WriteLine(ex.ToString());
}
}
Console.WriteLine($"************** One by one processing of leads finished ****************");
}