。Where(i =>!i.IsDeleted)不会转换为SQL但是.Where(i => i.IsDeleted.Equals(false))

时间:2013-08-16 15:39:45

标签: c# sql linq entity-framework entity-framework-6

我正在使用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键解决...

1 个答案:

答案 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执行。

稍后我遇到了OrderByIQueryable您需要Expression<Func<T, K>>个参数并且我使用Expression<Func<T, IComperable>>的问题,但是实体框架无法将Func<T, int>投放到Func<T, IComperable> 要查看有关如何解决此问题的详细信息,请参阅我的其他问题HERE