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。我将更新我的答案