我有两个非常相似的方法:
public IQueryable<User> Find(Func<User, bool> exp)
{
return db.Users.Where(exp);
}
public IQueryable<User> All()
{
return db.Users.Where(x => !x.deleted);
}
最上面一个,不会编译,说它返回IEnumerable而不是IQueryable。
为什么会这样?
另外,我知道我可以在最后添加“AsQueryable()”,它会起作用。虽然这有什么不同?任何表演命中?我知道IQueryable推迟了执行,我还能获得这个好处吗?
答案 0 :(得分:17)
Enumerable.Where
需要Func<T, bool>
。
Queryable.Where
需要Expression<Func<T, bool>>
。
您正在使用Func<T, bool>
调用位置,因此只有Enumerable.Where
调用适用,并且会返回IEnumerable<T>
。
将您的方法更改为:
public IQueryable<User> Find(Expression<Func<User, bool>> exp)
{
return db.Users.Where(exp);
}
它应该没问题。基本上,您希望传入表达式树而不是委托,以便表达式可以转换为SQL。