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

Chr*_*Fin 5 c# sql linq entity-framework entity-framework-6

我正在使用ASP.NET MVC 4和Entity Framework 6(代码优先)并且有一些我不想要的奇怪行为:
我有一个Images具有布尔属性的实体类,IsDeleted现在我想得到前25个图像,哪些没有删除,所以我使用了以下代码:

IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25);
Run Code Online (Sandbox Code Playgroud)

由于这非常缓慢,我进行了更深入的调查,发现Where(i => !i.IsDeleted)已经触发了DB查询并且所有图像都被加载(并且解析=>慢),然后检查"在代码中"发生.然后我试过Where(i => i.IsDeleted.Equals(false))哪个工作正常,检查发生在SQL上.

为什么会这样或者如何避免这个问题,因为我更喜欢第一种语法?
这可能是EF 6测试版的一个错误,还是在EF版本中会发生这种情况?

更新:
问题是转换为IEnumerable<Image>(我Where在我的代码中没有在同一行中,但为了简单起见在此处更改了它),但我也使用它来执行.OrderBy(...).ThenBy(...)使用Func<T, TKey>-keys并确实返回IOrderedEnumerable而不是IOrderedQueryable...

更新2: 使用Expression<Func<T, TKey>>密钥解决...

Chr*_*Fin 0

问题是,一旦您使用IEnumerable该查询,就会执行该查询,并且以下所有查询都将作为 LINQ to 对象查询发生。

我的错误导致这个问题是我通过以下方式测试了查询:

IEnumerable<Image> items = db.Images.Where(i => i.IsDeleted.Equals(false));
Run Code Online (Sandbox Code Playgroud)

IEnumerable<Image> items = db.Images;
images = images.Where(i => !i.IsDeleted);
Run Code Online (Sandbox Code Playgroud)

因此,在第一种情况下,Where仍然针对 a 执行IQueryable,但在第二种情况下,针对IEnumerable.

后来我遇到了一个问题, forOrderByIQueryableyou needExpression<Func<T, K>>参数,我使用了Expression<Func<T, IComperable>>,但是 egFunc<T, int>不能Func<T, IComperable>被实体框架强制转换。
要查看如何解决此问题的详细信息,请参阅我的其他问题此处