查询孩子及其子女,直到没有孩子简化为止

时间:2013-07-11 16:44:17

标签: c# asp.net-mvc linq entity-framework

假设我们有一个具有以下属性的实体:

public class Foo    
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
}

子项是任何具有非null ParentId的Foo。可以有多个级别的父/子关系,此时最多可达5个。

是否有一种简单的LINQ方式或一般方法可以从Foo开始,让它的所有孩子及其孩子的孩子,以及它的孩子&#39 ;孩子等?

目前,我循环开始父母的每个孩子,然后再次循环以获得所有孩子的孩子等。这很乏味且看起来不正确实现我想要的方式。

2 个答案:

答案 0 :(得分:1)

我更喜欢维护一个表示层次结构中某个位置的字符串属性。例如,如果值为“/ 99/42”,那么您知道该项属于父42,属于99.这很好的原因是因为您可以展平整个Foos集合并只查询该字段以“/ 99”开头的那些,你将获得层次结构的整个分支。所以你的课程看起来像这样:

public class Foo    
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Path { get; set; } //eg: /99/42
}

希望有所帮助。

答案 1 :(得分:1)

因此,如果 all 你拥有的是一个Foo个对象,那么你就无法获得所有它的后代。至少,您需要有一系列所有 Foo个对象,以便找到将该对象作为父对象的节点,因为您的{{1对象尚未引用它的子对象。如果你有那个序列,那就不是特别难了。

您可以对所有foos的序列使用Foo来为该ID值的所有子项创建ID查找:

ToLookup

要获取特定孩子的所有后代序列,您现在可以进行简单的树遍历:

var allFoos = new List<Foo>();

var childrenLookup = allFoos.ToLookup(foo => foo.ParentId);