C# 如何使用EF和LINQ构建层次树
我使用以下代码尝试使用EF构建层次/父子关系模型:C# 如何使用EF和LINQ构建层次树,c#,recursion,ef-code-first,C#,Recursion,Ef Code First,我使用以下代码尝试使用EF构建层次/父子关系模型: ICollection<Content> contentList = _dbset.Where( content => content.CompanyId == companyId && content.ParentContentId == null && content.Deleted == false)
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();
ICollection contentList=\u dbset.Where(
内容=>
content.CompanyId==CompanyId&&content.ParentContentId==null&&content.Deleted==false)
.OrderBy(content=>content.SortLevel)
.Include(content=>content.subcent.Select(childContent=>childContent.subcent)).ToList();
在这种情况下,我如何使用EF构建父子树?因此,基本上您有n个孩子,他们有更多的孩子?如果没有太多的函数,为什么不使用递归函数呢
我问的原因是如果你没有太多的函数,如果你最终递归一个函数足够多次,你可能会得到一个异常。但是这需要很多深度。也许您可以尝试通过不动点操作符执行递归操作:
// 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);
}
//静态定点运算符(高度可重用)
公共静态操作ActionFix(函数f)
{
返回t=>f(ActionFix(f))(t);
}
//你的递归排序
foreach(contentList中的var parentContent)
{
ActionFix(
actionContent=>
内容=>
{
//在节点的子对象上排序
content.subcent=content.subcent.OrderBy(sc=>sc.SortLevel.ToList();
//子项上每个元素的递归排序
content.subcent.ToList().ForEach(actionContent);
})
(内容);
}
由于EF跟踪加载到db上下文中的所有对象,除非在实际查询中关闭跟踪,否则您可以将构建树所需的所有记录加载到上下文中,然后在上一个结果集/集合上编写linq查询,通过在查询中指定父id来过滤所有子->孙记录。例如
ICollection<object> treeList = <dbcontent>.<entity>.All().ToList();
treeList = treeList.Where(o => o.ParentId == 0).ToList();
ICollection树列表=…All().ToList();
treeList=treeList.Where(o=>o.ParentId==0.ToList();
正确。我可以只写一个递归函数,但我没有一个确定数量的子函数,这是我最关心的。即使如此,我也不会太担心它,除非你碰到几千个子函数。