【问题标题】:How to get the IQueryable<T> extension methods instead of the IEnumerable<T> extensions?如何获取 IQueryable<T> 扩展方法而不是 IEnumerable<T> 扩展?
【发布时间】:2011-11-06 09:54:51
【问题描述】:

可能真的很简单,所以请原谅我的无知...

据我所知,Where() 扩展方法有几种风格:

Queryable.Where&lt;TSource&gt; Method (IQueryable&lt;TSource&gt;, Expression&lt;Func&lt;TSource, Boolean&gt;&gt;)

Enumerable.Where&lt;TSource&gt; Method (IEnumerable&lt;TSource&gt;, Func&lt;TSource, Boolean&gt;)

上述两个扩展都位于 System.Linq 命名空间中,所以我可以做 Where() 希望足以证明我已经导入了正确的命名空间 - 或者我需要另一个命名空间对于 IQueryable 扩展?

我知道IQueryable&lt;T&gt; 继承自IEnumerable&lt;T&gt;,但为什么我不能获得IQueryable&lt;T&gt; 扩展?

class Test
{
    IQueryable<Test> SomeMethod(Func<T, bool> criteria)
    {
        return new List<Test> { new Test() }.AsQueryable().Where(criteria); // compiler error converting IEnumerable<T> to IQueryable<T>
    }

}

如上所示,应该有一个可用的扩展方法返回 IQueryable?为什么会解析为 IEnumerable Extensions?

【问题讨论】:

  • 请描述一下你真正想做的事情。您的代码甚至无法编译:扩展方法必须是静态的。您试图在非静态类中声明非静态扩展方法。
  • 我的错误 - 我会纠正它,但答案很明显 - 我通过 Func&lt;T, bool&gt; 强制 IEnumerable 扩展,而我需要的当然是 Expression&lt;T, bool&gt;。现在,如果我停下来阅读我发布的所有这些可爱的链接......

标签: c# .net-4.0 extension-methods ienumerable iqueryable


【解决方案1】:

Queryable.Where Extension Method 需要 Expression&lt;Func&lt;T, bool&gt;&gt;(即表示 lambda 的表达式树),而不是 Func&lt;T, bool&gt;(lambda 本身)。

这行得通:

IQueryable<Test> ApplyCriteria(IQueryable<Test> queryable,
                               Expression<Func<Test, bool>> criteria)
{   //                              ↑
    return queryable.Where(criteria);
}

【讨论】:

  • 谢谢 - 我知道这很明显 =)
【解决方案2】:

IQueryable&lt;T&gt;.Where() 仅适用于 Expression&lt;Func&lt;T, bool&gt;&gt; 作为谓词参数。

【讨论】:

  • ulrichb - 你和@dtb 同时发布了正确答案,但他是第一个对此进行扩展的人,所以我将他标记为答案。不过还是谢谢!!
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多