Получить общее количество записей, если в записях более 50000 записей - PullRequest
1 голос
/ 26 марта 2019

У нас огромное количество записей в нашей сущности CRM. Я пытаюсь получить общее количество записей с помощью совокупного числа в выборке XML. Но у него есть ограничение в 50000 записей. Я думаю, что есть способ изменить эту настройку в локальной CRM. Но я не хочу это менять.

Ранее мы использовали метод нумерации страниц для получения общего количества (5000 каждый раз). Но это занимает много времени

public static int GetTotalRowCount(string fetchXml)
{
  try
  {
    using (OrganizationServiceContext svcContext = new OrganizationServiceContext(ServerConnection.CrmService))
    {
      int totalCount = 0;
      int fetchCount = 5000;
      int pageNumber = 1;
      string pagingCookie = null;
      string xml = string.Empty;
      RetrieveMultipleRequest fetchRequest1 = null;
      EntityCollection entityCollection = null;

      xml = CreateXml(fetchXml, pagingCookie, pageNumber, fetchCount);
      fetchRequest1 = new RetrieveMultipleRequest
      {
        Query = new FetchExpression(xml)
      };

      entityCollection = ((RetrieveMultipleResponse)svcContext.Execute(fetchRequest1)).EntityCollection;

      while (entityCollection.MoreRecords)
      {
        //moving to next page
        pageNumber++;

        xml = CreateXml(fetchXml, pagingCookie, pageNumber, fetchCount);
        fetchRequest1 = new RetrieveMultipleRequest
        {
          Query = new FetchExpression(xml)
        };

        entityCollection = ((RetrieveMultipleResponse)svcContext.Execute(fetchRequest1)).EntityCollection;
        totalCount = totalCount + entityCollection.Entities.Count;
      }

      return totalCount;
    }
  }
  catch (Exception ex)
  {
  }
}

но это занимает много времени. Поэтому я изменил его на метод совокупного подсчета - Изменил Fetchxml, как это -

<fetch mapping='logical' output-format='xml-platform' no-lock='true' distinct='false' aggregate='true'>
  <entity name='abc_data'>
    <attribute name='abc_id' aggregate='count' alias='count'/>.....

код, подобный этому

 int Count = 0;
 FetchExpression fetch = new FetchExpression(fetchXml);
 EntityCollection result = ServerConnection.CrmService.RetrieveMultiple(fetch);
 if (result.Entities.Count > 0)
 {
     Entity entity = result.Entities[0];
     AliasedValue value = (AliasedValue)entity["count"];
     Count = (int)value.Value;
  }
  return Count ;

Теперь здесь выдается исключение, если записи превышают 50000.

Так есть ли способ получить 50000 записей за один раз с помощью совокупного счета и пройти по нему, чтобы получить общий счет?

1 Ответ

0 голосов
/ 26 марта 2019

Ограничения агрегации FetchXML - это проблема, с которой мы все сталкиваемся. Я хотел решить проблему раз и навсегда, поэтому я создал онлайн-инструмент AggX для запуска агрегатов на любом количестве строк. В настоящее время он свободен в использовании.

Вы можете проверить его на https://aggx.meta.tools, и обратите внимание, что он работает только с Dynamics 365 Online. Кроме того, обратите внимание, что если у вас большое количество строк, для запуска которых потребуется более 5 минут, вам следует следить за AggX, чтобы избежать автоматического выхода из системы после нескольких минут простоя.

Если ваша система работает в режиме on-prem или вы хотите написать собственный код для выполнения агрегатов, вы можете разработать алгоритм для разделения данных на куски, содержащие менее 50000 строк. Затем вы можете запустить агрегат FetchXML для каждого чанка и суммировать результаты. Вот как работает двигатель AggX.

...