Vb.net 实体框架:在投影中包含多个子级别
我使用这样的投影:Vb.net 实体框架:在投影中包含多个子级别,vb.net,entity-framework,Vb.net,Entity Framework,我使用这样的投影: Dim mylist = (From t In context.Myobj1 where t.id=6 _ Select New With {_ .Parent = t, _ .fd = t.ch1.Where(Function(t3) t3.vl>5), _ .fh = t.ch2 _ }).ToList 问题是ch1有一个子集合“ch11”,我想在这个投影中包含它 谢谢大家
Dim mylist = (From t In context.Myobj1 where t.id=6 _
Select New With {_
.Parent = t, _
.fd = t.ch1.Where(Function(t3) t3.vl>5), _
.fh = t.ch2 _
}).ToList
问题是ch1有一个子集合“ch11”,我想在这个投影中包含它
谢谢大家!
我使用下面建议的解决方案进行了一些测试,发现了以下问题: 1) 有时第二级的子项没有加载。但奇怪的是,只有在第一级的子项中只有一项与第二级的子项相关的情况下才会发生这种情况。(例如,如果在ch1中只有一个项目与ch11中的特定项目相关,则不加载ch11中的该项目) 2) 此解决方案仅适用于第二级儿童(当然适用于1中描述的问题)。如果尝试对第三级或更多级应用相同的逻辑,则不起作用 有解决办法吗?
谢谢大家! 您可能注意到不能使用
Include
(如t.ch1.Include…
)。因此,您必须将子集合添加到投影中,例如,通过创建嵌套的匿名类型:
Dim mylist = (From t In context.Myobj1 where t.id=6 _
Select New With {_
.Parent = t, _
.fd = From c1 in t.ch1.Where(Function(t3) t3.vl > 5) _
Select New With { _
c1 _
.c11 = c1.ch11 _
}, _
.fh = t.ch2 _
}).ToList
现在ch1
s将拥有其子集合ch11
,因为EF通过关系修复填充它们
您可以演示,如果关闭延迟加载
context.Configuration.LazyLoadingEnabled = False
然后做
myList.First().fd.First().c1.ch11
(不是myList.First().fd.First().c11
)
您将看到第一个
c1
的ch11
集合在不执行新查询的情况下返回。(在启用延迟加载的情况下,它将运行一个查询,因为c1.ch11
在仅由关系修复填充时未标记为已加载)。谢谢,它可以工作,但此逻辑是否可以与其他子级别一起工作,例如,如果ch11有另一个子级别ch111?这似乎是不工作的儿童超过2级。有什么解决办法吗?你必须对你想包括的每一个级别重复这个技巧。我尝试重复,但不起作用,我在编辑的第一篇文章中描述了其他问题