延迟加载是否会在迭代时加载整个集合?

Che*_*hev 1 c# linq ienumerable entity-framework lazy-loading

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

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

Art*_*ers 5

@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;    
}    
Run Code Online (Sandbox Code Playgroud)

如果您事先知道您正在寻找哪个实体,则可以更进一步.例如,要加载Role1,您可以执行以下操作:

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

这篇文章提供了有关Query方法的更多细节:

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

如果你想让这个更多的transaprent,你不需要在运行查询时可用的上下文,那么看看这些博客文章,解释如何制作超延迟的集合:

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/