我有一个数据库表,其中所有记录彼此链接,即类似于下面的图像:
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.我希望我足够清楚,但如果有什么需要澄清让我知道。
答案 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表创建一个带有自我重构父列的层次结构集合。
希望他们帮忙,如果你还在寻找答案。