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