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

问题描述 投票:4回答:4

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

我正在用C#编写代码,但是为了以防万一,JS也将变得很了解。

QueryExpression query = new QueryExpression
{
  EntityName = "contact",
  ColumnSet = new ColumnSet(true),
};
EntityCollection response = organizationService.RetrieveMultiple(query);
IEnumerable<Entity> entities = response.Entities;
dynamics-crm-2011
4个回答
4
投票

您可以在响应上使用TotalRecordCount

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

11
投票

这是您的选择:

  1. 使用QueryExpression / Linq进行CRM-尽管这些方法不支持服务器端计数。因此,基本上这就是您现在要执行的操作,将每条记录返回给客户端,然后进行计数。负面影响如下:
    1. 您获得页面大小,而不是数据库中的真实数字。
    2. 页面大小限制为5000条记录,因此您必须实现自己的逻辑才能继续重新查询,直到返回所有记录为止
    3. 效率极低。来自所有实体的所有数据都必须返回。
  2. oData-从技术上讲,您可以使用odata,但由于它也不支持服务器端计数,因此您将遇到与QueryExpressions / Linq相同的确切问题。
  3. 使用Fetch XML-这是在CRM中获取记录总数的唯一受支持的方法。它还具有执行返回所需信息所需的最少工作量的优势。

这里是检索计数所需的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网站明确指出只有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


1
投票

您可以通过计数聚合来执行FetchXML。


-1
投票

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

尝试做一个

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

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

© www.soinside.com 2019 - 2024. All rights reserved.