首先,我使用带有代码优先方法的EF 6.0。
我的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.Company_7035BEA374959AC1 ...这样的丑陋哈希)。

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

任何澄清将不胜感激。

最佳答案



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



是的,这是正确的,但是要小心,如果您处理上下文,则延迟加载将不起作用(它将引发ObjectDisposedException)。
另外,虽然您的代码可以使用,但是由于生成的SQL请求数量可能会导致性能问题。

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

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

10-12 02:58