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 部署中,您可以配置此限制。
我一直在努力针对 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 部署中,您可以配置此限制。