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