Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用EF和LINQ构建层次树_C#_Recursion_Ef Code First - Fatal编程技术网

C# 如何使用EF和LINQ构建层次树

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)

我使用以下代码尝试使用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();
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();

正确。我可以只写一个递归函数,但我没有一个确定数量的子函数,这是我最关心的。即使如此,我也不会太担心它,除非你碰到几千个子函数。