首先,我正在使用EF 6.0的Code First方法。
我的配置设置为启用"代理创建"和"延迟加载"。
我的问题是: 延迟加载是否适用于返回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
方法返回的实体启用(在调试模式下,我可以看到类似于System.Data.Entity.DynamicProxies.Company_7035BEA374959AC1
的丑陋哈希值...)。即使在不同的DLL上调用它时,延迟加载也可以正常工作。 这是正确的吗? 我的意思是,即使我的方法返回一个
IEnumerable
(而不是IQueryable
),不同的DLL是否可以在我的数据库中进行后续调用?非常感谢任何澄清。
.ToList()
时,这并不意味着它会变成急切加载而不是延迟加载吗? - Nashmár