C# .Where(i=>;!i.IsDeleted)不转换为SQL,但.Where(i=>;i.IsDeleted.Equals(false))转换为SQL

C# .Where(i=>;!i.IsDeleted)不转换为SQL,但.Where(i=>;i.IsDeleted.Equals(false))转换为SQL,c#,sql,linq,entity-framework,entity-framework-6,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); IEnumerable items=db.Images.Where(i=>!i.IsDelet

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

IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25);
IEnumerable items=db.Images.Where(i=>!i.IsDeleted).Take(25);
由于速度非常慢,我进行了更深入的研究,发现
Where(I=>!I.IsDeleted)
已经触发了DB查询,所有图像都被加载(并解析=>slow),然后在“代码”中进行检查。然后我尝试了
Where(I=>I.IsDeleted.Equals(false))
,效果很好,通过SQL进行检查

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

更新:
问题是转换为
IEnumerable
(我在代码中做了
Where
不在同一行,但为了简单起见在这里做了更改),但我也使用它来执行
.OrderBy(…).ThenBy(…)
使用
Func
-键,返回
IOrderedEnumerable
而不是
IOrderedQueryable

更新2:
通过使用
Expression
键解决…

问题是,只要使用
IEnumerable
查询就会执行,并且以下所有查询都将作为LINQ to objects查询发生

我的错误导致了这个问题的出现,我用以下方式测试了这些查询:

IEnumerable<Image> items = db.Images.Where(i => i.IsDeleted.Equals(false));
IEnumerable items=db.Images.Where(i=>i.IsDeleted.Equals(false));

IEnumerable items=db.Images;
images=images.Where(i=>!i.IsDeleted);
因此,在第一种情况下,
其中
仍然针对
IQueryable
执行,但在第二种情况下针对
IEnumerable
执行

后来我遇到了一个问题,对于
OrderBy
IQueryable
您需要
Expression
参数,我使用了
Expression
,但例如
Func
不能按实体框架转换为
Func


要了解如何克服此问题的详细信息,请参阅我的另一个问题

Hrm。这很奇怪。(i=>i.IsDeleted==false)的位置如何?@Tim:与
相同!i、 我删除了
,但我认为这可能是我对IEnumerable的隐式转换,而不是
中的
(我做的
等于
“内联”,但
“在下一行”)-我正在调查…@chrfin好的,原因如下。当您执行
IEnumerable items=db.Images时,您将把数据库中的所有项放入内存改为使用
IQueryable
,在两行中创建查询,直到您真正想要它执行时才执行它。@chrfin您可以尝试添加
.AsEnumerable()
,如果强制执行的话。@KingKing:我错了,因为我在
IEnumerable
强制执行和
之前做了
Equals
测试在。。。
IEnumerable<Image> items = db.Images;
images = images.Where(i => !i.IsDeleted);