如何查看CRM 2011中的联系人总数?

4 dynamics-crm-2011

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

我在C#中编码,但JS也是要了解,以防万一.

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

Dar*_*ryl 11

以下是您的选择:

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

注意50K限制!

可以聚合的实体数量限制为50,000个. 看到这个问题

如果此限制太低,您可以执行SO问题建议,并捕获异常并返回50,000.如果你需要一个精确的计数,可能最简单的方法是添加一个过滤器,将名称限制为以单个字母开头,然后执行26个不同的查询,每个字母一个.假设名称的完全均匀分布(不是这样),您应该能够获得1,300,000的最大数量.


Microsoft Site明确声明只有Fetch XML支持Grouping/Aggregate函数 - > http://msdn.microsoft.com/en-us/library/gg334607.aspx

  • @KonradViltersten我做了一个成功的测试,返回了32632的计数. (2认同)
  • 我认为你的意思是*均匀分布*(即每个值都是同样可能的)而不是*正态分布*(即字符*i*到*p*中间的驼峰).我也喜欢26个查询的实用方法(如果额外拆分为**非常**的大数据集,则为26 ^ 2). (2认同)

Kon*_*ten 4

您可以在响应上使用TotalRecordCount

Console.WriteLine("Total number of records: " + response.TotalRecordCount);
Run Code Online (Sandbox Code Playgroud)