我有这样一张桌子:
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中找到它?
答案 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;
}