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)也工作良好。

EF:可查询的,不加载孩子

我认为你可以使用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,因为如果没有它,它将不总是工作(它可能工作,但并不总是)

注意:值得注意的是,我在数据库负载过重时遇到过这个问题。第二次尝试可以正常工作,但有时,初始查询不能正确延迟加载元素。