0
Entity Frameworkは何らかの再帰LINQをサポートしていますか、またはクエリをSQLで記述する必要はありますか? (ParentIdを使用する - 典型的なカテゴリのサブカテゴリの問題)エンティティフレームワーク再帰関係階層データ
Entity Frameworkは何らかの再帰LINQをサポートしていますか、またはクエリをSQLで記述する必要はありますか? (ParentIdを使用する - 典型的なカテゴリのサブカテゴリの問題)エンティティフレームワーク再帰関係階層データ
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; }
}
正確に達成したいことはありますか?具体的にしてください。 – cloudikka
@cloudikka階層全体を取り出すなど基本的な操作 – john
(1)それはしません。これはEF固有のものではありませんが、一般的には 'Queryable'と式ツリーの制限があります。再帰式を定義する方法はありません。 (2)EFナビゲーションプロパティの修正により階層全体をとることが可能です。しかし、すべての子を持つツリーの一部を取ることは、単一のL2Eクエリでは不可能です(3つすべてを読み込み、メモリにフィルタを適用する場合を除く)。 「[LINQで再帰的クエリが可能です]」(https://stackoverflow.com/questions/41894751/is-recursive-query-possible-in-linq/41909322#41909322) –