【发布时间】:2019-03-26 11:22:02
【问题描述】:
我们的 CRM 实体中有大量记录。我正在尝试借助 fetch 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 条记录并遍历它以获取总计数?
【问题讨论】:
-
@omkar,一年前,我使用 D365 的“Dynabacus 解决方案”,它返回所选实体的记录总数(没有任何限制),我试图找到该解决方案但运气不好,发布商可能已经从他们的网站上删除了该解决方案。
标签: c# dynamics-crm crm dynamics-crm-2015