Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从表中获取平面链表_C#_Linq - Fatal编程技术网

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列。