6

现在使用的方法是检查从 DB 读取的数组的大小。只要对其进行其他操作,这样的背负就可以了。但是,我想知道是否有更直接的方法来查询现有联系人的数量。

我正在用 C# 编写代码,但 JS 也需要了解一下,以防万一。

QueryExpression query = new QueryExpression
{
  EntityName = "contact",
  ColumnSet = new ColumnSet(true),
};
EntityCollection response = organizationService.RetrieveMultiple(query);
IEnumerable<Entity> entities = response.Entities;
4

4 回答 4

12

以下是您的选择:

  1. 使用 QueryExpression/Linq to CRM - 这些方法虽然不支持服务器端计数。所以这基本上就是你现在正在做的事情,将每条记录返回给客户端,然后计数。负面因素如下:
    1. 你得到的页面大小,而不是数据库中的真实数字。
    2. 页面大小限制为 5000 条记录,因此您必须实现自己的逻辑才能继续重新查询,直到返回所有记录
    3. 效率极低。必须返回来自所有实体的所有数据。
  2. oData - 从技术上讲,您可以使用 odata,但您将遇到与 QueryExpressions/Linq 相同的问题,因为它也不支持服务器端计数。
  3. 使用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

于 2013-03-14T12:31:05.607 回答
4

您可以在response上使用TotalRecordCount

Console.WriteLine("Total number of records: " + response.TotalRecordCount);
于 2013-03-14T10:00:29.013 回答
1

您可以使用计数聚合执行 FetchXML。

于 2013-03-14T10:38:36.317 回答
-1

我假设您正在从数据库中执行某种选择语句并查看返回的 DataTable 对象以查看它有多少行。

尝试做一个

SELECT COUNT(*) FROM [TableName] WHERE [condition]

这将返回一个与行数相同的数字。

于 2013-03-14T10:02:26.213 回答