实体框架 - 即使使用ToList()也可以进行延迟加载

时间:2014-03-07 12:34:06

标签: c# entity-framework

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

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

任何澄清将不胜感激。

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

是的,这是正确的,但要小心,如果你处理你的上下文,延迟加载将无效(它将抛出.ToList())。 此外,虽然您的代码可以正常工作,但由于生成的SQL请求数量可能会出现性能问题。

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