我有一张桌子,它本身就有一个树形结构。
Id ParentId Name
----------------
1 null x
2 null y
3 null z
4 null t
5 1 xx
6 1 xy
7 1 xz
8 2 yx
9 2 yy
10 9 yyx
11 10 yyxx
12 11 yyxxx
我想在根节点下检索整个子树。当我的根节点是“x”时,我想获得节点集{1,5,6,7,10,11,12}。我怎么能通过linq做到这一点?
答案 0 :(得分:1)
如果您能够更改表结构以添加额外字段,那么我过去使用的一种方法是使用“路径”字段,该字段包含以逗号分隔的ID列表。
ID ParentID Name Path
-- -------- ---- ----
1 null x 1
2 null y 2
3 null z 3
4 null t 4
5 1 xx 1,5
6 1 xy 1,6
7 1 xz 1,7
8 2 yx 2,8
9 2 yy 2,9
10 9 yyx 2,9,10
11 10 yyxx 2,9,10,11
12 11 yyxxx 2,9,10,11,12
然后,您可以使用LIKE(或Linq中的StartsWith)基于Path字段进行查询
在你的问题中,你说你想获得{1,5,6,7,10,11,12},但如果我读得正确,那些ID就是两个不同子树的一部分。
获得“x”及其所有孩子......
where Path = "1" || Path.StartsWith("1,")
让x的孩子......
where Path.StartsWith("1,")
答案 1 :(得分:0)
/// <summary>
/// Allows to recursively select descendants as plain collection
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <param name="DescendBy"></param>
/// <returns></returns>
public static IEnumerable<T> Descendants<T>(
this IEnumerable<T> source, Func<T, IEnumerable<T>> DescendBy)
{
foreach (T value in source)
{
yield return value;
foreach (var child in DescendBy(value).Descendants(DescendBy))
{
yield return child;
}
}
}
用法: node.children.Descendants(节点=&GT; node.children);
答案 2 :(得分:0)
您需要使用Table本身在Linq中执行内部联接,如下所示:
from root in TableName
join subnodes in TableName on root.Id equals subnodes.ParentId
select new { Name }
这将检索父ID与Id匹配的所有记录,其中相同的表重命名为子节点
谢谢