我正在使用 ASP.NET MVC 4 和 Entity Framework 6(代码优先)并且有一些我不想要/不喜欢的奇怪行为:我有一个具有布尔属性
的实体类,现在我想获取前 25 个图像,没有被删除,所以我使用了以下代码:Images
IsDeleted
IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25);
由于这非常慢,我进行了更深入的调查并发现,Where(i => !i.IsDeleted)
已经触发了数据库查询并且所有图像都已加载(并解析 => 慢),然后检查发生在“代码中”。然后我尝试Where(i => i.IsDeleted.Equals(false))
了哪个工作正常,并通过 SQL 进行检查。
为什么会这样,或者我怎样才能避免这个问题,因为我更喜欢第一种语法?
这可能是 EF 6 beta 的错误还是在所有 EF 版本中都会发生?
更新:
问题是转换为IEnumerable<Image>
(我Where
在我的代码中没有在同一行中做了,但为了简单起见在这里改变了它),但我也用它来做一个.OrderBy(...).ThenBy(...)
using Func<T, TKey>
-keys 并且它确实返回IOrderedEnumerable
而不是IOrderedQueryable
......
更新2:
通过使用Expression<Func<T, TKey>>
密钥解决...