如何获得亲子关系的世代数

时间:2016-06-23 14:05:57

标签: sql linq linq-to-sql

我有这样一张桌子:

ID    Person    ParentID
1     P1        0
2     P2        1
3     P3        1
4     P4        0
5     P5        4
6     P6        4
7     P7        4
8     P8        3
9     P9        3
10    P10       6
11    P11       7

所以,这些关系如下:

P1
  -> P2
  -> P3
       -> P8
       -> P9
P4
  -> P5
  -> P6
       -> P10
  -> P7
       -> P11

P1,P4(parents)
P2,P3,P5,P6,P7(children)
P8,P9,P10,P11(grandchildren)

这种关系有三代人。我怎样才能在sql中找到它?

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为你需要先对每个元素的子元素进行分组,然后创建一些递归方法来获取这些元素:

var query= context.People.GroupBy(p=>p.ParentId ?? 0);//In case ParentId is null, by default this element is going to be a root.
var roots= query.FirstOrDefault(g=>g.Key==0);

int max=0;
foreach(var p in roots)
{
   var temp=GetLevels(1, p, query);
   if(temp>max)
   {
     max=temp;
   }
}

这可能是递归方法:

public int GetLevels(int level,Person current, IQueryable<IGrouping<int,Person>> groups)
{
        var g = groups.FirstOrDefault(g => g.Key == current.Id);
        if(g==null)
        {
            return level;
        }
        int max = level;
        foreach (var child in g)
        {
           int currentLevel= GetLevels(level + 1, child, groups);
            if (currentLevel>max)
            {
                max = currentLevel;
            }
        }
        return max;
}