如何获取IQueryable <t>扩展方法而不是IEnumerable <t>扩展?</t> </t>

时间:2011-08-29 23:07:44

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

可能非常简单,请原谅我的无知......

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

Queryable.Where<TSource> Method (IQueryable<TSource>, Expression<Func<TSource, Boolean>>)

Enumerable.Where<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)

以上两个扩展名都位于System.Linq命名空间中,因此我可以完全Where()进行验证,以便我已经导入了正确的命名空间 - 或者是否存在我需要IQueryable扩展的另一个命名空间吗?

我理解IQueryable<T>继承自IEnumerable<T>,但为什么我无法获得IQueryable<T>个扩展名?

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?

2 个答案:

答案 0 :(得分:6)

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

这有效:

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

答案 1 :(得分:4)

IQueryable<T>.Where()仅适用于Expression<Func<T, bool>>作为谓词参数。