【问题标题】:ToList() incorrect evaluation when using Include使用 Include 时 ToList() 计算不正确
【发布时间】:2016-11-02 18:58:20
【问题描述】:

考虑我有以下sn-p:

IQueryable<BaseEntity> someQueryble = ApplicationDbContext.BaseEntities;
var randomQueryable = someQueryable.OfType<RandomEntity>()
                                   .Include(prop => prop.SomeRandomNavProp)
                                   .OrderBy(prop => prop.Id);

BaseEntities 只是来自 EF 6 的 ApplicationDbContextDbSetRandomEntity 继承自 BaseEntity(Table-Per-Type 层次结构)

然后,奇怪的事情发生了:

randomQueryable.Take(10).Count();
10
randomQueryable.Take(10).ToList().Count;
20

删除Include 后,一切正常。为什么.include 会影响ToList,我该如何解决?

编辑:生成的 SQL:

http://pastebin.com/SS3WD7P6

注意 - 它来自生产数据库,因此可读性会受到影响。第一个查询是关于Count,第二个查询是关于ToList()

【问题讨论】:

  • 只是想确认一下,您确定您使用的是 EF6 而不是 EF Core? Core 有一些与此类似的错误。
  • 哈,这绝对是关键 - Include 在内部使用 ORDER BY 来正确关联数据,因此它需要确定性排序。
  • @pwas 是的,完全一样。虽然没有好的解决方案 - 我猜你想在IQueryable上寻呼?如果没有,即如果您要实现结果,那么一些加载技巧而不是Include 可能会有所帮助。让我知道是否是这种情况,但可能这应该是一个不同的问题。
  • @IvanStoev - 是的,分页是在 IQueryable 上完成的。但更重要的是 - 我已经改变了订购功能。看我的回答:) 谢谢你的帮助!

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


【解决方案1】:

感谢@Evk 和@IvanStoev 发现了一篇关于Guid.NewGuid() 订购的好帖子:https://stackoverflow.com/a/8140495/5417374

用以下扩展方法替换订单功能解决了问题(基于上述问题中的其他答案):

public static IOrderedQueryable<BaseEntity> Randomize(
                         this IQueryable<BaseEntity> queryable)
{
    var seed = Random.NextDouble();

    return queryable.OrderBy(o => SqlFunctions.Checksum(o.Id * seed))
                     .ThenBy(o => o.Id);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多