2017-11-08 3 views
0

asp.net C# + EF 사용하여 parentChild 개체가있는 일부 입력이 필요합니다.C#에서 sql db 부모 부모 자식 트리를 작성하십시오.

목적 :

public class Organo 
{ 
    [Key] 
    public int id { get; set; } 
    public int key { get; set; } 
    public int parent { get; set; } 
    public string name { get; set; } 
    public string text { get; set; } 
    [NotMapped] 
    public List<Organo> OrganoChildrens { get; set; } 
} 

데이터 예 :

id | key | parent | name | text 
----+-------+----------+--------+---------- 
1  1  0   A  A 
2  2  1   B  B 
3  3  1   C  C 
4  4  2   B1  B1 
5  5  4   B1_1 B1_1 
6  6  1   D  D 

내 컨트롤러 ASP.NET보기

내 클래스 (DB 테이블)에 부모와 자녀로 구성 객체를 반환 :

public async Task<ActionResult> index() 
{ 
     //get all data 
     var organos = await db.Organos.ToListAsync(); 

     Organo organo_ = new Organo(); 

     foreach (var item in organos) 
     { 
      //head of diagram 
      if(item.parent == 0) 
      { 
       organo_.id = item.id; 
       organo_.key = item.key; 
       organo_.parent = 0; 
       organo_.name = item.name; 
       organo_.text = item.text; 
      } 
      else 
      { 
       //child 
       Organo organoChild_ = new Organo(); 
       organoChild_.id = item.id; 
       organoChild_.key = item.key; 
       organoChild_.parent = item.parent; 
       organoChild_.name = item.name; 
       organoChild_.text = item.text; 
       organo_.OrganoChildrens.Add(organoChild_); 
      } 
     } 

     return View(fishbone_); 
} 

그러나이와 난 단지 ... 내가 부모의 계층 구조를 구축하는 방법을 아이들의 첫 번째 수준을 얻을 -

+1

재귀를 사용하여 부모 인 경우 부모의 자식을 반복합니다. – reggaeguitar

+0

두 번째 else? 제게 어떤 이데아를 주시겠습니까? – user2633804

+0

하나의 다이어그램 헤드가 있습니까? – reggaeguitar

답변

0

뭔가를 시도> 자식 1의 자식 2 ....

많은 감사 -> 자식 1

public async Task<ActionResult> index() 
    { 
      //get all data 
      var organos = await db.Organos.ToListAsync(); 
      var populatedOrgano = PopulateChildren(organos.Single(x => x.parent == 0)); 


      return View(populatedOrgano); 
    } 

    public Organo PopulateChildren(Organo sourceOrgano, ICollection<Organo> organos) 
    { 
     Organo organo_ = new Organo(); 
     var children = organos.Where(x => x.parent == sourceOrgano.id); 
     foreach (var child in children)     
     { 
      //child 
      Organo organoChild_ = new Organo(); 
      organoChild_.id = child.id; 
      organoChild_.key = child.key; 
      organoChild_.parent = child.parent; 
      organoChild_.name = child.name; 
      organoChild_.text = child.text; 
      organo_.OrganoChildrens = new List<Organo>(); 
      organo_.OrganoChildrens.Add(organoChild_); 
      PopulateChildren(child, organos); 
     } 
     return organo_; 
    } 
+0

아직 테스트하지는 않았지만, 오르 토스가 새롭게 등장하면서 약간의 이상 함이있을 수 있습니다. – reggaeguitar

+0

여기에 오류가 표시됩니다. organo_.OrganoChildrens.Add (organoChild_); > 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. – user2633804

+0

내 편집을 확인하십시오. 추가하기 전에 OrganoChildrens 목록을 새로 작성하기 만하면됩니다. – reggaeguitar

0

먼저 계층 구조 데이터를 나타 내기 위해 뷰 모델이 필요하며 데이터 모델에서 [NotMapped]public List<Organo> OrganoChildrens { get; set; } 속성을 제거하십시오. null 값) 실제로 존재하지 않는 어떤 0을 사용하지 않고 최고 수준의 객체를 의미있게

public class OrganoVM 
{ 
    public int ID { get; set; } 
    public int Key { get; set; } 
    public string Name { get; set; } 
    public string Text { get; set; } 
    public List<OrganoVM> Children { get; set; } 
} 

또한, 데이터베이스 널 (NULL)에 parent 필드를 만드는 것이 좋습니다. 아래 코드는 nullparent 필드를 기반으로합니다.

은 그럼 당신은

OrganoVM model = groups[null].FirstOrDefault(); 

를 사용하여 (하나가 가정) 계층 구조를

// Sort and group the records 
var groups = db.Organos 
    .OrderBy(x => x.parent) 
    .ToLookup(x => x.parent, x => new OrganoVM 
    { 
     ID = x.id, 
     Key = x.key, 
     Name = x.Name, 
     Text = x.text 
    }); 

// Assign children 
foreach (var item in groups.SelectMany(x => x)) 
{ 
    item.children = groups[item.ID].ToList(); 
} 

그런 다음 '최상위'객체를 반환 할 수 있습니다를 생성 .ToLookup().GroupBy()을 사용할 수 있습니다 또는 여러 개의 '최상위'객체 (parent = null)가있는 경우

List<OrganoVM> model = groups[null].ToList(); 

보기를 표시하지 않았거나 계층 적 데이터를 표시하려는 방법이 있지만 this answer과 비슷한 DOM을 재귀 적으로 작성하는 HtmlHelper 확장 방법을 고려해 볼 수 있습니다.

관련 문제