Lazy Loading即使使用ToList()也是如此

首先,我使用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可以在我的数据库中进行后续调用吗?

任何澄清将不胜感激。


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

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

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

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

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

链接地址: http://www.djcxy.com/p/77863.html

上一篇: Lazy Loading working even with ToList()

下一篇: c#