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

fab*_*tto 9 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;              
}
Run Code Online (Sandbox Code Playgroud)

请注意评论,我说:"我来到这里没有错误!".这意味着即使在ToList()通话后延迟加载也能正常工作.我认为转换后IQueryableListIEnumerable在EF将失去做延迟加载的能力.

我已经注意到代理仍然启用了GetCompanies方法返回的实体(在debbug模式中,我可以看到丑陋的哈希,如:System.Data.Entity.DynamicProxies.Company_7035BEA374959AC1...).

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

任何澄清将不胜感激.

ken*_*n2k 5

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

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

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

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

旁注:我个人建议不要使用延迟加载。参见/sf/answers/1496565731/