0

Entity Framework에서 일종의 재귀 LINQ를 지원합니까? 아니면 SQL에서 쿼리를 작성해야합니까? (ParentId 사용 - 일반적인 카테고리 하위 카테고리 문제)엔터티 프레임 워크 재귀 관계 계층 적 데이터

+2

정확히 달성하기를 원하십니까? 구체적으로하십시오. – cloudikka

+0

@cloudikka 예를 들어 전체 계층 구조를 꺼내는 것과 같은 기본 작업 – john

+0

(1) 그렇지 않습니다. 이것은 EF에 특화된 것이 아니지만 'Queryable'과 표현 트리 제한은 일반적으로 재귀 표현을 정의 할 방법이 아닙니다. (2) EF 탐색 속성 수정으로 인해 전체 계층 구조를 가져올 수 있습니다. 그러나 모든 자식으로 트리의 일부를 가져 오는 것은 하나의 L2E 쿼리로는 불가능합니다 (전체 3 개를로드 한 다음 메모리에 필터를 적용한 경우 제외). [LINQ에서 재귀 쿼리가 가능합니까?] (https://stackoverflow.com/questions/41894751/is-recursive-query-possible-in-linq/41909322#41909322) –

답변

0

Include 확장 메소드 내에서 메소드를 사용하여 해결할 수 있다고 생각합니다. 계층 구조 만 가져 오거나 모두 가져올 수 있습니다. 심지어 꽤 추악한 SQL을 생성 할 수 있습니다.

using(var context = new HierarchyContext()) 
{ 
    var depth = context 
       .Categories 
       .IncludeHierarchy(3, nameof(Category.Children)); 

    var root = depth.Single(c => c.Id == 2); 
} 


public static IQueryable<T> IncludeHierarchy<T>(this IQueryable<T> source, 
uint depth, string propertyName) 
where T : Category 
{ 
    var temp = source; 

    for (var i = 1; i <= depth; i++) 
    { 
     var sb = new StringBuilder(); 

     for (var j = 0; j < i; j++) 
     { 
      if (j > 0) 
      { 
       sb.Append("."); 
      } 

      sb.Append(propertyName); 
     } 

     var path = sb.ToString(); 

     temp = temp.Include(path); 
    } 

    var result = temp; 

    return result; 
} 

public class Category 
{  
    // Primary key  
    public int Id { get; set; } 

    // Category name  
    public string Name { get; set; } 

    // Foreign key relationship to parent category  
    public int ParentId { get; set; } 

    // Navigation property to parent category  
    public virtual Category Parent { get; set; } 

    // Navigation property to child categories  
    public virtual ICollection<Category> Children { get; set; }  
}