Sql 如何获取父子关系的生成计数

Sql 如何获取父子关系的生成计数,sql,linq,linq-to-sql,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

我有一张这样的桌子:

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中找到它


我认为您需要首先对每个元素的子元素进行分组,并创建一些递归方法来获得级别:

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;
}
public int-GetLevels(int-level、Person-current、IQueryable组)
{
var g=groups.FirstOrDefault(g=>g.Key==current.Id);
如果(g==null)
{
回报水平;
}
int max=水平;
foreach(g中的变量child)
{
int currentLevel=GetLevel(级别+1,子级,组);
如果(当前级别>最大值)
{
最大值=当前水平;
}
}
返回最大值;
}

我认为您需要首先对每个元素的子元素进行分组,并创建一些递归方法来获得级别:

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;
}
public int-GetLevels(int-level、Person-current、IQueryable组)
{
var g=groups.FirstOrDefault(g=>g.Key==current.Id);
如果(g==null)
{
回报水平;
}
int max=水平;
foreach(g中的变量child)
{
int currentLevel=GetLevel(级别+1,子级,组);
如果(当前级别>最大值)
{
最大值=当前水平;
}
}
返回最大值;
}

请发布您的预期输出格式I预期数量3。我只需要3(代数),所以您需要代数是的,我需要代数请发布您的预期输出格式我预期的代数3。我只需要3(代数),所以您需要代数是的,我需要代数我在GetLevels方法调用中获取“query”参数的错误。您可以提供更多详细信息吗?您的
ParentId
是一个整数,对吗?是的。它是整数。我得到了这个错误:是的,它是一个整数,但该列可以是
null
,这就是为什么您的键是一个可为null的int(
int?
)而不是int。我要更新我的答案。我得到了GetLevels方法调用中“query”参数的错误。您能提供更多详细信息吗?您的
ParentId
是一个整数,对吗?是的。它是整数。我得到这个错误:是的,它是一个整数,但该列可以是
null
,这就是为什么您的键是一个可为null的int(
int?
),而不是int。我将更新我的答案