在像下面这样的树中,每个条目只知道其父id和订单号,那么查询Foo的所有后代的好方法是什么?
1:Foo公司
2:儿童
3:孙子1
4:孙子2
5:巴
6:巴兹
我可以得到这样的孩子
var q = from item in foos
where item.parentid == "Foo"
select item;
但是,如何在一个查询中使所有子代达到任何深度如果可能的话,我想避免多个查询的递归。具体来说,我想得到所有可能的后代,不仅仅是子孙后代,还有第n级的后代我想我可以用这样的订单号来查询
var q = from item in foos
where item.ordernumber > 1 && item.ordernumber < 5
select item;
但在这种情况下,我不知道如何获取
5
,这意味着下一个非子代订单号。1
在这一点上总是已知的。编辑:添加忘记的细节,我希望它选择所有的后代,而不仅仅是孩子和孙子。
最佳答案
找不到答案,所以把我的解决方案放在这里。我使用了一个通过调用递归函数来构建列表的函数递归函数接受一个id,将具有该id的行添加到列表(子代),检查该行是否有子代,如果有子代,则启动for each并为每个子代调用自己,传入子代的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中有效地构建“获取后代”算法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16420079/