gpt4 book ai didi

algorithm - 如何在 linq-to-entities 中有效地构建一个 "Get descendants"算法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:01:43 24 4
gpt4 key购买 nike

在像下面这样的树中,每个项目只知道其父 ID 和订单号,查询 Foo 的所有后代的好方法是什么?

  • 1:富
    • 2: child
      • 3:孙子 1
      • 4:孙子 2
  • 5:酒吧
  • 6:巴兹

我可以生出这样的 child

var q = from item in foos
where item.parentid == "Foo"
select item;

但是我怎样才能在单个查询中获得所有后代的任意深度呢?如果可能的话,我想避免使用多个查询进行递归。具体来说,我想获得所有可能级别的后代,不仅是 child 和孙子,还有第 n 级的 child 。我想我可以像这种情况一样使用订单号进行查询

var q = from item in foos
where item.ordernumber > 1 && item.ordernumber < 5
select item;

但在这种情况下,我不知道如何获得 5,这意味着下一个非后代订单号。 1 此时始终已知。


编辑:添加了被遗忘的细节,我希望它选择所有后代,而不仅仅是 child 和孙子。

最佳答案

无法找到答案,所以将我的解决方案放在这里。我使用了一个通过调用递归函数来构建列表的函数。递归函数获取一个 id,将具有该 ID 的行添加到列表(后代),检查该行的子项,如果有子项,则它启动 foreach 并为每个子项调用自身,传入子项的 id :

    public List<WikiPageModel> Descendants;        

public List<WikiPageModel> GetDescendantsOf(int id)
{
Descendants = new List<WikiPageModel>();
GetDescendantsOf_Recursor(id);
return Descendants;
}

public void GetDescendantsOf_Recursor(int id)
{
var page = WikiPages.FirstOrDefault(x => x.PageId == id);
Descendants.Add(page);
var children = GetChildrenOf(id);
if (children.Any())
{
foreach (var child in children)
{
id = child.PageId;
GetDescendantsOf_Recursor(id);
}
}
}

public List<WikiPageModel> GetChildrenOf(int pageId)
{
return WikiPages.Where(x => x.ParentPageId == pageId).ToList();
}

关于algorithm - 如何在 linq-to-entities 中有效地构建一个 "Get descendants"算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16420079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com