0

EFを使用して階層/親子関係モデルを構築しようとしている次のコードがあります:

ICollection<Content> contentList = _dbset.Where(
                content =>
                content.CompanyId == companyId && content.ParentContentId == null && content.Deleted == false)
                .OrderBy(content => content.SortLevel)
                .Include(content => content.SubContent.Select(childContent => childContent.SubContent)).ToList();

このシナリオで EF を使用して親子ツリーを構築するにはどうすればよいですか?

4

3 に答える 3

1

実際のクエリで追跡がオフにされていない限り、EF は db コンテキストにロードされたすべてのオブジェクトを追跡するため、ツリーを構築するために必要なすべてのレコードをコンテキストにロードし、前の結果セット/コレクションに linq クエリを記述して、すべてをフィルタリングすることができます。 child->grandchild レコードは、クエリで親 ID を指定します。例えば

ICollection<object> treeList = <dbcontent>.<entity>.All().ToList();
treeList = treeList.Where(o => o.ParentId == 0).ToList();
于 2012-04-25T14:28:02.060 に答える
0

たぶん、フィックスポイント演算子を使用して再帰アクションを試すことができます。

// static fixpoint operator (highly reusable)
public static Action<T> ActionFix<T>(Func<Action<T>, Action<T>> f)
{
    return t => f(ActionFix(f))(t);
}

// your recursive ordering
foreach (var parentContent in contentList)
{

  ActionFix<Content>(
     actionContent => 
           content => 
                {
                 // ordering on the subContent of the node
                 content.SubContent = content.SubContent.OrderBy(sc => sc.SortLevel).ToList();  
                 // recursive ordering on each element on the subContent
                 content.SubContent.ToList().ForEach(actionContent);
                })
  (parentContent);
}
于 2012-04-16T08:26:21.807 に答える
0

つまり、基本的に、より多くの子供を持つ n 人の子供がいますか? それらをあまり多く持たないのであれば、なぜ再帰関数を持たないのでしょうか?

それらの数が多すぎないかどうかを尋ねている理由は、最終的に関数を十分な回数再帰すると例外が発生する可能性があるためです。しかし...それには多くの深さが必要です。

于 2012-04-16T07:43:10.717 に答える