c# - Entity Framework - 延迟加载甚至可以与 ToList() 一起使用

标签 c# entity-framework

首先,我使用 EF 6.0 和 Code First 方法。 我的 context 配置设置为启用“代理创建”和“延迟加载”。

我的问题是: 延迟加载是否适用于返回 IEnumerable(而不是 IQueryable)的方法的结果?

我认为下面的代码更能说明问题:

public void Test()
{
    var company = GetCompanies().FirstOrDefault();

    if (company.Employees.Count() > 0)
    {
        //I got here without errors!
    }
}

public IEnumerable<Company> GetCompanies() 
{
    var company = context.Companies.ToList();
    //Note that I did not Include the Employee (child table)

    return company;              
}

请注意我所说的评论:“我没有错误地到达这里!”。这意味着延迟加载即使在 ToList() 调用之后也能正常工作。我认为在将 IQueryable 转换为 ListIEnumerable 后,EF 将失去延迟加载的能力。

我注意到代理仍然为 GetCompanies 方法返回的实体启用(在 Debug模式下我可以看到丑陋的散列,如:System.Data.Entity.DynamicProxies。公司_7035BEA374959AC1...)。

即使在不同的 DLL 上调用延迟加载也能正常工作。这样对吗?我的意思是,即使我的方法返回 IEnumerable(而不是 IQueryable),不同的 DLL 是否可以在我的数据库中进行后续调用?

如有任何澄清,我们将不胜感激。

最佳答案

Note that comment that I say: "I got here without errors!". It means that lazy loading is working even after ToList() call.

这就是延迟加载的全部要点:您可以在需要时从数据库中获取实体(即当您访问该属性时),而不仅仅是在您第一次执行查询时(即您调用 .ToList()).

The lazy loading works even calling it on different DLL. Is this correct? I mean, can a different DLL made subsequent calls in my database even if my method return an IEnumerable (and not IQueriable)?

是的,它是正确的,但要小心,如果你处置你的上下文,延迟加载将不起作用(它会抛出一个 ObjectDisposedException)。 此外,虽然您的代码可以正常工作,但由于生成的 SQL 请求数量,您可能会遇到性能问题。

旁注:我个人建议不要使用延迟加载。参见 https://stackoverflow.com/a/21379510/870604

关于c# - Entity Framework - 延迟加载甚至可以与 ToList() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22250246/

相关文章:

c# - Entity Framework Core RowVersion 列未使用 PostgreSQL 更新

c# - 无法在 LINQ to Entities 中将字符串转换为 GUID

c# - 引发事件 ("onchange")

c# - 无法写入文件名为 "aux"的任何路径

mysql - Entity Framework 5(MySQL)作为现有MVC4解决方案上的项目(类库)

entity-framework - Entity Framework 会自动缓存 ModelBuilder 模型吗?

c# - 更改 EDMX 中所有表的架构名称

c# - 在 WinPhone 中使用 PCL 中的 System.ComponentModel.DataAnnotations 就像 "microsoft bcl portability pack"一样?

c# - 如何在Docker中运行32位.NET Core应用程序

c# - GCHandleType.Pinned 是否类似于使用 "fixed"关键字?