【问题标题】:Implementing IQueryable.Count实现 IQueryable.Count
【发布时间】:2010-11-23 18:43:41
【问题描述】:

我正在开发一个 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 完成所有的工作,并为表达式树计算出查询字符串。这一切都运行良好,因此对 Where、OrderBy 和 Take 进行了排序。该网络服务支持使用以下方式进行计数查询:

int count = myWebService.Count(query);

但我无法将它放在 IQueryable 或 IQueryProvider 中。

我基本上是通过阅读教程和开源示例来工作的,但似乎找不到一个可以做 Count 的。

【问题讨论】:

  • 嗯,是从IQueryable.Count返回的。你的问题到底是什么?
  • 我正在写一个提供程序,但我真的不知道我在做什么!我真的在找例子……
  • 如果你真的不知道自己在做什么,我很高兴你可以实现 WhereOrderByTakeCount 和其他人完全一样,所以我对你的困惑感到困惑。
  • 我想是因为 myWebService.Select 总是返回一个 List (这对于 where、orderby 和 Take 来说很好),而 myWebService.Count 返回一个 int。我想我需要更多地了解基础知识!

标签: c# linq iqueryable


【解决方案1】:

这是一系列关于 IQueryable 实现的(诚然相当复杂的)Count() 实现的文章。计数本身在“Part X - Group By and Aggregates”中。

LINQ: Building an IQueryable provider series

【讨论】:

  • 相比,我已经很容易了! Web 服务不支持任何分组或任何复杂的子选择,因此我的查询字符串不会比“where var1 > 10 and var2 == 5 order var2”复杂得多
【解决方案2】:

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

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

我做了一些调试,查询myContext.Where(x =&gt; x.var1 &gt; 5) Execute 被调用,TResultIEnumerable&lt;MyClass&gt;

对于myContext.Where(x =&gt; x.var1 &gt; 5).Count() Execute 被调用并且TResultint

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

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多