首先,我使用 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
方法返回的实体启用(在 Debug模式下我可以看到丑陋的散列,如:System.Data.Entity.DynamicProxies。公司_7035BEA374959AC1
...)。
即使在不同的 DLL 上调用延迟加载也能正常工作。这样对吗?我的意思是,即使我的方法返回 IEnumerable
(而不是 IQueryable
),不同的 DLL 是否可以在我的数据库中进行后续调用?
如有任何澄清,我们将不胜感激。
最佳答案
Note that comment that I say: "I got here without errors!". It means that lazy loading is working even after ToList() call.
这就是延迟加载的全部要点:您可以在需要时从数据库中获取实体(即当您访问该属性时),而不仅仅是在您第一次执行查询时(即您调用 .ToList()
).
The lazy loading works even calling it on different DLL. Is this correct? I mean, can a different DLL made subsequent calls in my database even if my method return an IEnumerable (and not IQueriable)?
是的,它是正确的,但要小心,如果你处置你的上下文,延迟加载将不起作用(它会抛出一个 ObjectDisposedException
)。
此外,虽然您的代码可以正常工作,但由于生成的 SQL 请求数量,您可能会遇到性能问题。
旁注:我个人建议不要使用延迟加载。参见 https://stackoverflow.com/a/21379510/870604
关于c# - Entity Framework - 延迟加载甚至可以与 ToList() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22250246/