【问题标题】:Does lazy loading load the entire collection upon iteration?延迟加载是否会在迭代时加载整个集合?
【发布时间】:2012-02-24 21:26:26
【问题描述】:

即使您只迭代集合中的第一项,延迟加载是否会加载整个集合?还是只加载集合中迭代的项目?

...或者我不知道我在说什么?

【问题讨论】:

  • ObjectContext 有一个 ObjectMaterialized 事件。您可以在遍历集合时收听此事件以找出答案。
  • @Alex Ford,您对 IEnumerable 的某些特定案例(实体框架)或一般案例感兴趣吗? IE。对于 IEnumerable 实现,只要您要求一个,就可以得到 7 个一组的项目。

标签: c# linq entity-framework lazy-loading ienumerable


【解决方案1】:

@Slauma 的回答是正确的——第一次访问导航属性时会加载整个集合。 “正常”导航属性必须采用这种方式,因为集合只是常规的 ICollection 而不是 IQueryable。

但是,如果您不想加载整个集合,您可以做两件事。如果您有可用的上下文,那么您可以使用 Query 方法真正延迟加载。例如:

foreach (var role in context.Entry(user).Collection(e => e.Roles).Query())
{    
    Console.WriteLine(role.Name);    
    if (role.Name == "Role1")    
        break;    
}    

如果您事先知道要查找的实体,您可以更进一步。例如,要仅加载 Role1,您可以这样做:

var role1 = context.Entry(user)
                .Collection(e => e.Roles)
                .Query()
                .Single(r => r.Name == "Role1");

这篇文章提供了更多关于查询方法的细节:

http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx

如果您想让它更加透明,以便在运行查询时不需要上下文可用,请查看这些解释如何制作超惰性集合的博客文章:

http://blog.oneunicorn.com/2011/03/28/extra-lazy-collection-count-with-ef-4-1-part-1/

以及更通用的 IQueryable 支持的集合:

http://blog.oneunicorn.com/2011/03/30/a-more-general-queryable-collection/

【讨论】:

  • 我还发现我的答案在进行更多测试时是错误的。我猜对延迟加载部分有太多的一厢情愿。顺便说一句很好的解释。
  • 关于数据库查询,您的第一个示例会做什么?它会在每次迭代中为单个角色生成一个查询吗?我实际上已经预料到,当您开始迭代时,all 角色只有一个查询。嗯,有意思……
【解决方案2】:

当您开始迭代集合时,延迟加载会加载整个集合。示例:假设user 1 具有角色“Role1”、“Role2”、“Role3”(user.Rolesvirtual):

var user = context.Users.Single(u => u.Id == 1);
foreach (var role in user.Roles) // DB query happens here once
{
    Console.WriteLine(role.Name);
    if (role.Name == "Role1")
        break;
}

尽管您从未访问过 Role2Role3,但它们仍然被加载。

【讨论】:

    【解决方案3】:

    每次迭代源可枚举时,它都会迭代一次投影。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 2020-01-23
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多