EF:可查询的,不加载孩子
本文关键字:加载 孩子 查询 EF | 更新日期: 2023-09-27 18:02:40
我有一个父模型与不同的子模型通过外键关系(延迟加载-> virtual
是on)。
似乎使用像
这样的查询Parent.Where(x=> x.something == true).AsQueryable()
不可预测。也就是说,有时会加载子线程,而有时不会(注意:这种情况从EF 6.1.3开始发生)。
我想知道是否有一种保证的方法可以在不使用include
的情况下按需惰性加载子节点。
确切地说:
var list = Parent.Where(x=> ...).Take(1);
foreach(var parent in list){
var childName = parent.Child.Name; //NOTE: Parent and Child are related by foreign key (some Id)
}
问题是Child被发现是空的,即使在数据库中的记录存在。
请注意,Include
工作良好,同时Take(50) instead of Take(1)
也工作良好。
我认为你可以使用include方法,像这样:
Parent.Include("孩子")。Where(x=> x.something == true);
,你不需要调用AsQueryable(),因为上面那行返回AsQueryable
我也注意到了这种行为。我一直只使用include,但如果你不想,你可以这样做:
var list = Parent.Where(p => p.Something == true).Select(p => p.Child.Parent)
我不太喜欢它,但是它强制子元素加载,然后返回父元素。
要确保延迟加载工作,请确保在连接字符串中有MultipleActiveResultSets=True
,因为如果没有它,它将不总是工作(它可能工作,但并不总是)
注意:值得注意的是,我在数据库负载过重时遇到过这个问题。第二次尝试可以正常工作,但有时,初始查询不能正确延迟加载元素。