2016-06-23 2 views
1

У меня есть таблица вроде этого:Как получить счет генерации родитель-потомок связи

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) 

Есть 3 поколения в этом отношения. Как я могу найти это в sql?

enter image description here

+0

напишите свой ожидаемый формат вывода – TheGameiswar

+0

Ожидаемое количество 3. Мне нужно только 3 (номер поколения) – 1teamsah

+0

, так что вы хотите, чтобы счетчик ионы – TheGameiswar

ответ

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; 
} 
+0

Я получаю ошибку для параметра «запрос» в вызове метода GetLevels. – 1teamsah

+0

Вы могли бы внести более подробную информацию об этом? Ваш 'ParentId' является целым, верно? – octavioccl

+0

Да. Это целое число. Я получаю эту ошибку: http://i.hizliresim.com/y46vWa.png – 1teamsah