实现IQueryable.Count

时间:2010-11-23 18:43:42

标签: c# linq iqueryable

我正在开发一个IQueryable提供商。在我的IQueryProvider中,我有以下代码:

public TResult Execute<TResult>(Expression expression)
{
    var query = GetQueryText(expression);

    // Call the Web service and get the results.
    var items = myWebService.Select<TResult>(query);

    IQueryable<TResult> queryableItems = items.AsQueryable<TResult>();
    return (TResult)queryableItems;
}

GetQueryText完成所有工作,并为表达式树计算查询字符串。这一切都运行良好,所以在哪里,OrderBy和Take排序。 Web服务支持使用以下内容进行计数查询:

int count = myWebService.Count(query);

但我无法理解我把它放在IQueryable或IQueryProvider中的地方。

我基本上从阅读教程和开源示例开始工作,但似乎无法找到一个做Count的。

2 个答案:

答案 0 :(得分:2)

这是关于IQueryable的一个(公认的相当复杂)实现的一系列文章,它们执行Count()。计数本身在“第X部分 - 分组依据和聚合”中。

LINQ: Building an IQueryable provider series

答案 1 :(得分:0)

答案似乎比我初步想象的要简单。 This blog post帮助:

  

Execute方法是实际执行查询表达式的提供程序的入口点。具有显式执行而不仅仅依赖于IEnumerable.GetEnumerator()是很重要的,因为它允许执行不一定产生序列的表达式。例如,查询“myquery.Count()”返回单个整数。此查询的表达式树是对Count方法的方法调用,该方法返回整数。 Queryable.Count方法(以及其他聚合等)使用此方法“立即”执行查询。

我做了一些调试,并且查询了myContext.Where(x => x.var1 > 5)执行被调用而TResultIEnumerable<MyClass>

对于myContext.Where(x => x.var1 > 5).Count()执行被调用且TResultint

所以我的Execute方法只需要适当地返回。