【发布时间】:2014-07-21 14:53:54
【问题描述】:
我开始更深入地了解 LINQ,但我无法理解一些 LINQ 扩展方法重载。
例如,假设我正在使用 .Where() 查询 DbContext。我总是传递标准的 Func,而不是所述 Func 的 Expression。下面的示例查询:
var db = new MyContext();
var foo = db.products.Where(p => p.Category == "books");
这就是我感到困惑的地方。当我查看可用的方法签名时,我会假设我上面使用的重载将返回一个 IEnumerable ......但它实际上返回一个 IQueryable。如果 IQueryable 重载需要一个表达式而不是一个函数,这怎么可能?感觉编译器通过(在这种情况下)为我构建表达式以某种方式帮助我,但我找不到解释是否是这种情况的资源。谢谢!
【问题讨论】:
-
如果您使用的是实体框架,那么在您的查询中使用 Func 可能会很糟糕。我们遇到过使用 lamda 中的 Func 查询数据库的情况。结果是 EF 将整个表返回给客户端,然后在客户端使用 Func 进行过滤。使用实体框架时,您绝对应该使用 Expression
>。