我一直在努力针对Dynamics CRM 2015 SDK OrganizationServiceContext
编写Linq查询。我发现CRM Linq Provider不支持我想要使用的Linq方法。
最新的是Count()
。我有一个IQuerable<Lead>
对象,想要计算枚举时返回的总记录数。但是在Count()
上调用IQueryable
会出错:
不支持“计数”方法
在我周围找到this advice,将Linq查询定义为IEnumerable
。这似乎有效 - 在Count()
对象上调用IEnumerable<Lead>
会返回总记录。
我想知道的是枚举操作发生的地方。它是动力学方面,还是将所有线索拉入我的网络服务器内存并计数?我首先执行计数的全部原因是为了防止将太大的数据集拉入内存...
答案 0 :(得分:5)
LINQ for CRM查询被转换为QueryExpression
个查询,因此仅限于其功能。 QueryExpression查询不支持聚合(如count,sum,average),因此您的查询确实会将所有选定的记录拉入内存。
获得正确计数的首选方法是使用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部署中,您可以配置此限制。