如果记录有超过50000条记录,则获取汇总记录总数

时间:2019-03-26 11:22:03

标签: c# dynamics-crm crm dynamics-crm-2015

我们的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 :(得分:0)

FetchXML聚合的局限性是我们所有人都面临的挑战。我想一劳永逸地解决该问题,因此我建立了一个称为AggX的在线工具来在任意数量的行上运行聚合。目前是免费使用。

您可以在https://aggx.meta.tools上签出,请注意,它仅适用于Dynamics 365 Online。另外,请注意,如果您有大量行要花5分钟以上的时间来运行,则应监视AggX,以免它在闲置几分钟后自动注销。

如果您的系统是本地系统,或者您想编写自己的代码进行聚合,则可以设计一种算法将数据拆分为少于50,000行的数据块。然后,您可以在每个块上运行FetchXML聚合并求和。这就是AggX引擎的工作方式。