Показать сообщение отдельно
Старый 02.09.2018, 17:55   #2  
Ion is offline
Ion
Участник
 
332 / 16 (1) ++
Регистрация: 19.12.2012
Вот такой код, как бы его оптимизировать
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 ****************");
        }