繁体   English   中英

如何获得IQueryable <T> 扩展方法而不是IEnumerable <T> 扩展?

[英]How to get the IQueryable<T> extension methods instead of the IEnumerable<T> extensions?

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

据我所知,有几种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?

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

这有效:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM