首先,我使用带有代码优先方法的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
转换为List
或IEnumerable
后,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/