我正在开发一个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的。
答案 0 :(得分:2)
这是关于IQueryable的一个(公认的相当复杂)实现的一系列文章,它们执行Count()。计数本身在“第X部分 - 分组依据和聚合”中。
答案 1 :(得分:0)
答案似乎比我初步想象的要简单。 This blog post帮助:
Execute方法是实际执行查询表达式的提供程序的入口点。具有显式执行而不仅仅依赖于IEnumerable.GetEnumerator()是很重要的,因为它允许执行不一定产生序列的表达式。例如,查询“myquery.Count()”返回单个整数。此查询的表达式树是对Count方法的方法调用,该方法返回整数。 Queryable.Count方法(以及其他聚合等)使用此方法“立即”执行查询。
我做了一些调试,并且查询了myContext.Where(x => x.var1 > 5)
执行被调用而TResult
是IEnumerable<MyClass>
对于myContext.Where(x => x.var1 > 5).Count()
执行被调用且TResult
是int
所以我的Execute方法只需要适当地返回。