我有一张类似于:
的表格did diScheduleLinkedID diScheduleID
8 47 71
9 71 72
10 45 67
11 72 85
12 67 78
14 85 92
其中表就像一个链表,diScheduleLinkedID以递归方式链接到diScheduleID。
我需要用ID(47)查询表格(希望在Linq中)并返回:
47,71,72,85,92
或使用ID 45并返回:
45,67,78
我尝试过类似的东西:.NET - LINQ AsHierarchy() extension method
然而它没有按预期工作
修改的 我使用了链接文章中的以下代码:
var hierachy = tbllinks.Where(w=>w.diScheduleLinkedID.Equals(pnID)).ToList().AsHierarchy(e => e.diScheduleLinkedID, e => e.diScheduleID);
然而它返回一个空列表,我看不到任何方法来过滤链表中的第一个ID(比如47)?
编辑2 能够使用Extension方法:
public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
{
foreach (T item in source)
{
yield return item;
IEnumerable<T> children = selector(item);
foreach (T child in children.Traverse(selector))
{
yield return child;
}
}
}
然后使用:
var result = tblpermit_links.Where(item => item.diScheduleLinkedID == 47)
.Traverse(item => tblpermit_links.Where(parent
=> item.diScheduleID == parent.diScheduleLinkedID));
虽然不确定性能如何!但是我可以在另一个领域预先过滤表。
也许我应该使用CTE?
答案 0 :(得分:1)
您的方法将获取数据,但它会通过重复查询表来实现。如果您无法更改表格,那么这是您可以做的最佳选择。
如果您可以更改表的结构,并且您的层次结构是非重叠树,则可以通过添加层次结构ID字段来大大加快速度,如下所示:
did diScheduleLinkedID diScheduleID hierarchyId
8 47 71 1
9 71 72 1
10 45 67 2
11 72 85 1
12 67 78 2
14 85 92 1
现在,您可以通过提供任何成员的hierarchyId
来查询整个树,然后“链接”内存中的节点。当然,这还需要在代码上保持hierarchyId
的完整性。