C# .Where(i=>;!i.IsDeleted)不转换为SQL,但.Where(i=>;i.IsDeleted.Equals(false))转换为SQL
我正在使用ASP.NET MVC 4和Entity Framework 6(代码优先),并且有一些我不想要的奇怪行为: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
我有一个实体类
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);