我正在使用ASP.NET MVC 4和实体框架6(代码优先)并且有一些我不想要的奇怪行为:
我有一个实体类Images
,它有一个布尔属性IsDeleted
,现在我想得到前25个图像,这些图像没有被删除,所以我使用了以下代码:
IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25);
由于这非常缓慢,我进行了更深入的调查,发现Where(i => !i.IsDeleted)
已经触发了数据库查询,并且所有图像都被加载(并且解析=&gt;慢),然后在代码中进行检查”。然后我尝试了Where(i => i.IsDeleted.Equals(false))
,它工作正常,检查通过SQL发生。
为什么会这样或者如何避免这个问题,因为我更喜欢第一种语法? 这可能是EF 6测试版的一个错误,还是在EF版本中发生?
更新
问题是强制转换为IEnumerable<Image>
(我的Where
不在我的代码中的同一行,但为了简单起见在此处进行了更改),但我也使用它来执行{{1}使用.OrderBy(...).ThenBy(...)
- 键,确实返回Func<T, TKey>
而不是IOrderedEnumerable
...
更新2:
使用IOrderedQueryable
键解决...
答案 0 :(得分:0)
问题是,只要您使用IEnumerable
,就会执行查询,并且所有以下查询都将作为对象查询的LINQ发生。
我对这个问题的错误是我通过以下方式测试了查询:
IEnumerable<Image> items = db.Images.Where(i => i.IsDeleted.Equals(false));
和
IEnumerable<Image> items = db.Images;
images = images.Where(i => !i.IsDeleted);
因此,在第一种情况下,Where
仍针对IQueryable
执行,但在第二种情况下针对IEnumerable
执行。
稍后我遇到了OrderBy
和IQueryable
您需要Expression<Func<T, K>>
个参数并且我使用Expression<Func<T, IComperable>>
的问题,但是实体框架无法将Func<T, int>
投放到Func<T, IComperable>
要查看有关如何解决此问题的详细信息,请参阅我的其他问题HERE