2009-03-23 7 views
1

Ich habe eine Tabelle, die eine Baumstruktur in sich hat.Wie bekomme ich eine Struktur strukturierte Tabellendaten von Linq?

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 

Ich möchte den gesamten Unterbaum unter einem Stammknoten abrufen. Wenn mein Wurzelknoten "x" ist, möchte ich die Menge der Knoten {1, 5, 6, 7, 10, 11, 12} erhalten. Wie kann ich das mit linq machen?

Antwort

1

Wenn Sie die Tabellenstruktur ändern können, um zusätzliche Felder hinzuzufügen, dann ist ein Ansatz, den ich in der Vergangenheit verwendet habe, ein "Path" -Feld zu haben, das eine durch Kommas getrennte Liste von IDs enthält.

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 

Dann können Sie auf dem Feld Pfad (oder Starts in Linq)

Sie sagen, Sie bekommen mit LIKE Abfrage basiert in Ihrer Frage {1, 5, 6, 7, 10, 11, 12}, aber diese IDs sind Teil von zwei verschiedenen Unterbäumen, wenn ich es richtig gelesen habe.

Um "x" und all seinen Kindern ...

where Path = "1" || Path.StartsWith("1,") 

nur Kinder x Um ...

where Path.StartsWith("1,") 
+0

Schöne Lösung, jemand-wie ich- denke, dass "einfach" das Beste ist! –

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; 
      } 
     } 
    } 

Nutzung: node.children.Descendants (node => node.children);

0

Sie müssen Inner sich Linq mit der Tabelle Join Führen Sie wie folgt vor:

from root in TableName 
join subnodes in TableName on root.Id equals subnodes.ParentId 
select new { Name } 

Diese alle diese Datensätze abruft, die Eltern-ID mit ID übereinstimmt mit einem Tisch untergeordneten Knoten umbenannt

Dank

Verwandte Themen