首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用EF和LINQ构建层次树

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

Stack Overflow用户
提问于 2012-04-16 15:00:35
回答 3查看 917关注 0票数 0

我有以下代码,我正在尝试使用EF构建一个分层/父子关系模型:

代码语言:javascript
复制
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构建父子树?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-25 22:28:02

因为EF跟踪加载到数据库上下文中的所有对象,除非在实际查询上关闭跟踪,否则可以加载构建上下文树所需的所有记录,然后在前一个结果集/集合上编写一个linq查询,通过在查询上指定父id来过滤所有子>孙记录。E.g

代码语言:javascript
复制
ICollection<object> treeList = <dbcontent>.<entity>.All().ToList();
treeList = treeList.Where(o => o.ParentId == 0).ToList();
票数 1
EN

Stack Overflow用户

发布于 2012-04-16 15:43:11

所以你基本上有n个孩子,他们有更多的孩子?如果你不想使用太多的函数,为什么不使用一个递归函数呢?

我之所以问你是否有太多的函数,如果你最终递归一个函数足够多的次数,你可能会得到一个异常。但是..。这需要很深的深度。

票数 0
EN

Stack Overflow用户

发布于 2012-04-16 16:26:22

也许你可以通过一个固定点运算符尝试一下递归操作:

代码语言:javascript
复制
// 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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10169872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档