从表

时间:2017-12-11 17:24:11

标签: c# linq

我有一张类似于:

的表格
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?

1 个答案:

答案 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的完整性。