[英]Entity Framework - Lazy Loading working even with ToList()
首先,我使用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
转换为List
或IEnumerable
,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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.