2016-10-20 3 views
0

하나의 목록에 데이터를 반환하는 두 개의 테이블 "CategoryGroup"및 "Category"가 있습니다. 요구 사항은 플랫 목록을 관련 카테고리를 포함하는 CategoryGroup과 같은 계층 구조 목록으로 변환하는 것입니다.평면을 계층 구조 목록으로 변환 하시겠습니까?

Result from both the tables

hieararchy리스트로 변환하는 방법을 제안하세요?

public class ProfileConditionGroup 
{ 
    public Guid ConditionGroupGUID { get; set; } 
    public string ConditionGroupName { get; set; } 
    public List<ProfileConditionList> profileConditions { get; set; } 
} 

public class ProfileConditionList 
{ 
    public string ConditionName { get; set; } 
    public Nullable<Guid> ConditionGUID { get; set; } 
    public string[] ThisConditionSelectedByProfileIDs { get; set; } 
    public Nullable<Guid> ParentConditionGroupGUID { get; set; } 
    public bool IsDefaultSelected { get; set; } 
} 
+4

'items.GroupBy (X => x.CategoryGroup)를'? – fubo

+0

두 테이블에 대해 C#의 클래스 정의를 제공하십시오. – Enigmativity

+0

@Enigmativity : 게시물이 업데이트되었습니다. – Supreet

답변

0

이것은 실제로 실제 콘크리트 반환 유형을하지 않고 조금 까다 롭습니다하지만, 여기에 그냥 Guid 값의 트리를 구축하는 경우 그것을 해결하려는 방법입니다.

var query = 
    from pcg in pcgs 
    from pcl in pcg.profileConditions 
    select new 
    { 
     pcg.ConditionGroupName, 
     pcg.ConditionGroupGUID, 
     pcl.ConditionName, 
     pcl.ConditionGUID, 
     pcl.ThisConditionSelectedByProfileIDs, 
     pcl.ParentConditionGroupGUID, 
     pcl.IsDefaultSelected, 
    }; 

... 나는이 작업을 수행 할 것 :
var lookup = query.ToLookup(x => x.ParentConditionGroupGUID); 

Func<Guid?, Tree<Guid?>> build = null; 
build = g => 
{ 
    var r = new Tree<Guid?>() { Value = g }; 
    r.AddRange(lookup[g].Select(x => build(x.ConditionGroupGUID))); 
    return r; 
}; 

지금 당신은 그냥 build(null)를 호출하고 Guid?의 나무를 얻어야한다

이 쿼리를 감안할 때. 자신 만의 출력 클래스를 만들 수 있다면이 기능을 Func<Guid?, Tree<YourOutputClass>>으로 변경할 수 있습니다.

당신은 트리이 클래스가 필요합니다

public class Tree<T> : List<Tree<T>> 
{ 
    public T Value { get; set; } 
} 
관련 문제