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

get*_*ode 3 linq asp.net sdk dynamics-crm dynamics-crm-2015

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

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

不支持"Count"方法

挖掘我发现这个建议是将Linq查询定义为IEnumerable.这似乎有效 - 调用Count()IEnumerable<Lead>对象返回总记录.

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

Hen*_*jen 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;
Run Code Online (Sandbox Code Playgroud)

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