CRM 2015 Linq Count() 查询 - 这是在枚举查询吗?

CRM 2015 Linq Count() query - is this enumerating the query?

我一直在努力针对 Dynamics CRM 2015 SDK OrganizationServiceContext 编写 Linq 查询。我发现 CRM Linq 提供程序通常不支持我想使用的 Linq 方法。

最新的是Count()。我有一个 IQuerable<Lead> 对象,想计算枚举时将返回的总记录数。但是在 IQueryable 上调用 Count() 会给出错误:

The method 'Count' is not supported

四处挖掘我发现 this advice 将 Linq 查询定义为 IEnumerable。这似乎有效 - 在 IEnumerable<Lead> 对象 returns 上调用 Count() 总记录。

我想知道的是枚举操作发生的地方。是动态方面,还是将所有潜在客户拉入我的网络服务器内存并在那里计数?我首先执行计数的全部原因是防止将太大的数据集拉入内存...

LINQ for CRM 查询被转换为 QueryExpression 查询,因此仅限于其功能。 QueryExpression 查询不支持聚合(如计数、总和、平均值),因此您的查询确实会将所有选定的记录拉入内存。

获得正确计数的首选方法是使用 FetchXml 查询。

QueryExpression计数也可以通过以下方式实现。 (我不确定这是如何翻译成 SQL;它的性能可能略差。)

举个例子:

var query = new QueryExpression("account")
{
    PageInfo = new PagingInfo
    {
        Count = 1,
        PageNumber = 1,
        ReturnTotalRecordCount = true
    }
};

var result = service.RetrieveMultiple(query);

if (result.TotalRecordCountLimitExceeded)
    throw new InvalidOperationException("Cannot get record count.");

return result.TotalRecordCount;

如您所见,可以统计的记录数是有限制的。我相信目前是50,000。在 OnPremise 部署中,您可以配置此限制。