可能非常简单,请原谅我的无知......
据我所知,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?
答案 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>>
作为谓词参数。