C# 从表中获取平面链表
我有一张类似于:C# 从表中获取平面链表,c#,linq,C#,Linq,我有一张类似于: did diScheduleLinkedID diScheduleID 8 47 71 9 71 72 10 45 67 11 72 85 12 67 78 14 85
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
45,67,78
或者ID为45,然后返回:
47,71,72,85,92
45,67,78
我尝试了类似于:.NET-
然而,它并没有像预期的那样工作
编辑
我使用了链接文章中的以下代码:
var hierachy = tbllinks.Where(w=>w.diScheduleLinkedID.Equals(pnID)).ToList().AsHierarchy(e => e.diScheduleLinkedID, e => e.diScheduleID);
但是它返回一个空列表,我看不到任何方法来过滤链接列表中的第一个ID(比如47)
编辑2
可以使用扩展方法执行此操作:
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;
}
}
}
但不确定性能是否会受到影响!但是,我将能够在另一个字段上对表进行预筛选
也许我应该使用CTE?您的方法将返回数据,但它会通过重复查询表来实现。如果你没有能力改变表格,那是你能做的最好的了 如果可以更改表的结构,并且层次结构是非重叠树,则可以通过添加层次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
s的完整性。那么您到底做了哪些尝试,使其无法工作呢?您链接的文章解决了几乎相同的问题。@Andrey请参见上面的编辑您是否使用sql server存储此数据?如果是这样,您应该检查hierarchyid数据类型@Hackerman我从未使用过该数据类型-我会检查它-thanks@Wattcey好的,他们实际上在解决稍微不同的问题。看看这个答案,我决定结合上面的方法和这个额外的id列。