实体框架:在投影中包含多个子级别

时间:2015-02-07 23:16:53

标签: 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"我希望在此预测中包含这些内容。

谢谢!


我使用下面建议的解决方案进行了一些测试,发现了以下问题:

1)有时第二级孩子没有被加载。但奇怪的是,这只发生在第一级孩子只有一个项目与这个二级孩子相关的情况下。 (例如,如果在ch1中只有一个项目与ch11中的特定项目相关,则未加载ch11中的该项目)

2)此解决方案仅适用于具有二级孩子的(当然具有1)中描述的问题。如果尝试将相同的逻辑应用于第三级或更高级别,则不起作用。

任何解决方案? 谢谢!

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在仅由关系修正填充时未标记为已加载。)