以下是您的选择:
- 使用 QueryExpression/Linq to CRM - 这些方法虽然不支持服务器端计数。所以这基本上就是你现在正在做的事情,将每条记录返回给客户端,然后计数。负面因素如下:
- 你得到的页面大小,而不是数据库中的真实数字。
- 页面大小限制为 5000 条记录,因此您必须实现自己的逻辑才能继续重新查询,直到返回所有记录
- 效率极低。必须返回来自所有实体的所有数据。
- oData - 从技术上讲,您可以使用 odata,但您将遇到与 QueryExpressions/Linq 相同的问题,因为它也不支持服务器端计数。
- 使用Fetch XML - 这是在 CRM 中获取记录总数的唯一受支持的方法。它还具有执行返回所需信息所需的最少工作量的优势。
以下是检索 Count 所需的 Fetch XML 和 C# 代码:
var xml = @"
<fetch distinct='false' mapping='logical' aggregate='true'>
<entity name='contact'>
<attribute name='contactid' alias='contact_count' aggregate='count'/>
</entity>
</fetch>";
using (var service = GetOrganizationServiceProxy())
{
var resultEntity = service.RetrieveMultiple(
new FetchExpression(xml)).Entities.First();
var count = resultEntity
.GetAttributeValue<Microsoft.Xrm.Sdk.AliasedValue>("contact_count").Value;
}
注意 50K 限制!
可以聚合的实体限制为 50,000 个。 看到这个问题
如果此限制太低,您可以按照 SO 问题的建议进行操作,并捕获异常并返回 50,000。如果您需要精确计数,最简单的做法可能是添加一个过滤器以将名称限制为以单个字母开头,然后执行 26 个不同的查询,每个字母一个。假设名称的分布完全一致(事实并非如此),您应该能够获得最多 1,300,000 个。
Microsoft 站点明确声明只有 Fetch XML 支持分组/聚合功能 --> http://msdn.microsoft.com/en-us/library/gg334607.aspx
对于 CRM/CDS V9+
现在有一个简单的请求来获取总数:https ://docs.microsoft.com/en-us/dotnet/api/microsoft.crm.sdk.messages.retrievetotalrecordcountrequest?view=dynamics-general-ce-9