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

所以你基本上有n个有更多孩子的孩子?如果您不打算拥有太多它们,为什么不使用递归函数呢?

我问你是否没有太多的原因,如果你最终递归一个函数足够多次,你可能会得到一个例外。但是......这需要很多深度。

于 2012-04-16T07:43:10.717 回答
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 回答