如何使用EF和LINQ构建分层树

时间:2012-04-16 07:00:35

标签: c# recursion ef-code-first

我有以下代码,我正在尝试使用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构建父子树?

3 个答案:

答案 0 :(得分:1)

由于EF跟踪加载到db上下文的所有对象,除非在实际查询中关闭跟踪,您可以将构建树所需的所有记录加载到上下文,然后在先前的结果集/集合上写入linq查询通过在查询上指定父ID来过滤所有child-&gt;孙子记录。 E.g

ICollection<object> treeList = <dbcontent>.<entity>.All().ToList();
treeList = treeList.Where(o => o.ParentId == 0).ToList();

答案 1 :(得分:0)

所以你基本上有一定数量的孩子有更多的孩子?如果你不打算太多,为什么不只是有一个递归函数呢?

我问你是否没有太多其中许多人的原因,如果你最终将一个函数递归到足够的时间,你可能会遇到异常。但是......这需要很多深度。

答案 2 :(得分:0)

也许您可以通过fixpoint运算符尝试递归Action:

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