代码之家  ›  专栏  ›  技术社区  ›  Tim

实现IQueryable.Count

  •  1
  • Tim  · 技术社区  · 14 年前

    我在找一个可液化的供应商。在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完成所有的leg工作,并为表达式树计算查询字符串。这一切都很好,所以在哪里,OrderBy和Take被排序。webservice支持使用以下内容的计数查询:

    int count = myWebService.Count(query);
    

    但是我无法想象我把这个放在了IQueryable或IQueryProvider里。

    我基本上读过教程和开源示例,但似乎找不到真正有用的。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Sean U    14 年前

    这里有一系列关于IQueryable实现的文章(无可否认,相当复杂),该实现确实是Count()。Count本身在“第X部分-Group By和Aggregates”中。

    LINQ: Building an IQueryable provider series

        2
  •  0
  •   Tim    14 年前

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

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

    我做了一些调试,并询问了 myContext.Where(x => x.var1 > 5) 调用Execute并 TResult 是一个 IEnumerable<MyClass>

    为了 myContext.Where(x => x.var1 > 5).Count() 调用Execute并 结果 是一个 int

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