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

时间:2013-03-14 09:55:47

标签: 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;

4 个答案:

答案 0 :(得分:10)

以下是您的选择:

  1. 使用QueryExpression / Linq到CRM - 但这些方法不支持服务器端计数。所以这基本上就是你现在正在做的事情,将每条记录返回给客户端然后再计数。对此的负面影响如下:
    1. 您获取的是页面大小,而不是数据库中的真实数字。
    2. 页面大小限制为5000条记录,因此您必须实施自己的逻辑才能继续重新查询,直到您返回所有记录
    3. 非常低效。必须返回所有实体的所有数据。
  2. oData - 从技术上讲,你可以使用odata,但是你会遇到与QueryExpressions / Linq完全相同的问题,因为它不支持服务器端计数。
  3. 使用Fetch XML - 这是在CRM中获取记录总计数的唯一受支持方法。它还具有返回所需信息所需的最少工作量的优势。
  4. 以下是检索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个实体的限制。 See this SO question

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


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

答案 1 :(得分:4)

您可以在响应上使用 TotalRecordCount

Console.WriteLine("Total number of records: " + response.TotalRecordCount);

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

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

尝试做

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

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