我使用这样的投影:
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)中描述的问题。如果尝试将相同的逻辑应用于第三级或更高级别,则不起作用。
任何解决方案? 谢谢!
答案 0 :(得分:2)
您可能已经注意到您无法使用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
将拥有其子集合ch11
,因为EF会通过 relationship fixup 填充它们。
如果你关闭延迟加载,你可以证明这一点......
context.Configuration.LazyLoadingEnabled = False
然后做......
myList.First().fd.First().c1.ch11
(不 myList.First().fd.First().c11
)
您会看到返回第一个c1
的{{1}}集合而不执行新查询。 (启用延迟加载后,它将运行查询,因为ch11
在仅由关系修正填充时未标记为已加载。)