5

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

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

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

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

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

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

4

1 回答 1

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仍然针对 a 执行IQueryable,但在第二种情况下针对IEnumerable.

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

于 2013-08-17T09:23:09.410 回答