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

时间:2015-07-22 09:42:12

标签: asp.net linq sdk dynamics-crm dynamics-crm-2015

我一直在努力针对Dynamics CRM 2015 SDK OrganizationServiceContext编写Linq查询。我发现CRM Linq Provider不支持我想要使用的Linq方法。

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

  

不支持“计数”方法

在我周围找到this advice,将Linq查询定义为IEnumerable。这似乎有效 - 在Count()对象上调用IEnumerable<Lead>会返回总记录。

我想知道的是枚举操作发生的地方。它是动力学方面,还是将所有线索拉入我的网络服务器内存并计数?我首先执行计数的全部原因是为了防止将太大的数据集拉入内存...

1 个答案:

答案 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部署中,您可以配置此限制。