【问题标题】:.Where(i => !i.IsDeleted) does not translate to SQL but .Where(i => i.IsDeleted.Equals(false)) does.Where(i => !i.IsDeleted) 不会转换为 SQL,但 .Where(i => i.IsDeleted.Equals(false)) 会
【发布时间】:2013-08-16 15:39:45
【问题描述】:

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

IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25);

由于这非常慢,我进行了更深入的调查并发现,Where(i =&gt; !i.IsDeleted) 已经触发了数据库查询,并且所有图像都已加载(并且解析 => 慢),然后检查发生在“代码中”。然后我尝试了Where(i =&gt; i.IsDeleted.Equals(false)),它运行良好,并且通过 SQL 进行了检查。

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

更新:
问题是转换为IEnumerable&lt;Image&gt;(我在我的代码中没有在同一行中使用Where,但为了简单起见在这里更改了它),但我也使用它来使用.OrderBy(...).ThenBy(...) 使用Func&lt;T, TKey&gt;-键,并且确实返回 IOrderedEnumerable 而不是 IOrderedQueryable...

更新 2: 使用Expression&lt;Func&lt;T, TKey&gt;&gt;键解决...

【问题讨论】:

  • 人力资源部。这很好奇。 Where(i => i.IsDeleted == false) 呢?
  • @Tim: 与!i.IsDeleted 相同,但我认为这可能是我对IEnumerable&lt;Image&gt; 的隐式转换,而不是Where(我做了Equals“内联”,但@ 987654337@“在下一行”)-我正在调查...
  • @chrfin 好的,这就是原因。当您执行 IEnumerable&lt;Image&gt; items = db.Images; 时,您会将数据库中的所有项目都放入内存中,而是使用 IQueryable,在几行中创建查询,并且在您真正想要它之前不让它执行。
  • @chrfin 你可以尝试添加.AsEnumerable(),而不是投射。
  • @KingKing:我错了,因为我在IEnumerable 演员和! 演员之前做了Equals 测试......

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


【解决方案1】:

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

我对这个问题的错误是我用以下方式测试了查询:

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&lt;Func&lt;T, K&gt;&gt; 参数,而我使用了Expression&lt;Func&lt;T, IComperable&gt;&gt;,但是例如实体框架无法将Func&lt;T, int&gt; 强制转换为Func&lt;T, IComperable&gt;
要查看如何克服这个问题的详细信息,请参阅我的另一个问题HERE

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 2022-07-13
    • 2022-12-27
    • 2020-12-16
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多