2016-06-23 1 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입니다. 세대 수 (세대 수)가 – 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 메서드 호출에서 "query"매개 변수에 대해 오류가 발생합니다. – 1teamsah

+0

당신은 그것에 대해 더 자세히 설명해 주시겠습니까? 당신의'부모 아이 '는 정수입니다, 맞습니까? – octavioccl

+0

예. 그것은 정수입니다. 이 오류가 발생합니다 : http://i.hizliresim.com/y46vWa.png – 1teamsah

관련 문제