帮助递归linq表达式

时间:2010-05-25 18:44:48

标签: linq

我有一个数据库表,其中所有记录彼此链接,即类似于下面的图像:

alt text http://img691.imageshack.us/img691/6772/38103866.png

如图所示,记录可以是root,并且可以有1个或多个子节点,其中每个子节点在其ParentID属性中存储其父节点的ID属性。我想知道是否有人可以帮我构建一个LINQ表达式,该表达式返回从最后一个子节点开始并以root结束的所有节点。我的意思是以下内容。从节点4(ID = 4)开始,我必须向上移动到节点2(ID = 2),然后是节点1,然后是节点0,从而跳过节点3.我希望我足够清楚,但如果有什么需要澄清让我知道。

2 个答案:

答案 0 :(得分:3)

这将完成工作:

static IEnumerable<Node> ListParents(IEnumerable<Node> list, int? ID)
{
    var current = list.Where(n => n.ID == ID).FirstOrDefault();
    if (current == null)
        return Enumerable.Empty<Node>();
    return Enumerable.Concat(new []{current}, ListParents(list, current.ParentID));
}

假设Node类如下:

class Node
{
    public int ID;
    public int? ParentID;
}

请注意,如果您的ParentID关系导致循环,则此函数将无限递归。

答案 1 :(得分:1)

我刚刚找到关于这个问题的文章,因为我正在寻找一些Linq查询信息。这些不符合我的需要,但我相信他们会做你想要的。

http://www.scip.be/index.php?Page=ArticlesNET18

他最后更新了这篇文章,并附上了一篇新文章的链接: http://www.scip.be/index.php?Page=ArticlesNET23

他创建了Extension方法,用falt表创建一个带有自我重构父列的层次结构集合。

希望他们帮忙,如果你还在寻找答案。