【问题标题】:Entity Framework - Lazy Loading working even with ToList()实体框架 - 即使使用 ToList() 也可以进行延迟加载
【发布时间】:2014-03-07 12:34:05
【问题描述】:

首先,我使用的是 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 方法返回的实体启用(在调试模式下,我可以看到丑陋的哈希值:System.Data.Entity.DynamicProxies.Company_7035BEA374959AC1...)。

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

任何澄清将不胜感激。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    请注意我说的评论:“我没有错误地来到这里!”。它的意思是 即使在 ToList() 调用之后延迟加载仍然有效。

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

    延迟加载甚至可以在不同的 DLL 上调用它。这是 正确的?我的意思是,不同的 DLL 是否可以在我的 即使我的方法返回 IEnumerable(而不是 IQueriable),也可以使用数据库?

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

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

    【讨论】:

    • 所以当我在某些查询上调用.ToList() 时,这并不意味着它变成了急切加载而不是延迟加载?
    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多