Hierarchische Daten in Linq - Optionen und Leistung
Habe ich einige hierarchische Daten - jeder Eintrag hat eine id und eine (nullable) parent-Eintrag id.
Ich möchte zum abrufen aller Einträge in der Baumstruktur unter einem bestimmten Eintrag. Dies ist in einer SQL Server 2005-Datenbank. Ich bin Abfragen mit LINQ to SQL in C# 3.5.
LINQ to SQL nicht unterstützt Common Table Expressions direkt. Meine Entscheidungen sind, die zum zusammenstellen der Daten in code mit mehreren LINQ-Abfragen, oder eine view auf die Datenbank, die die Oberflächen einer CTE.
Welche option (oder andere option), glauben Sie, wird besser, wenn Datenmengen zu groß werden?
SQL Server 2008 ist, ist HierarchyId-Typ unterstützt Linq to SQL?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde eine view und einen zugehörigen Tisch-basierte Funktion, die basierend auf den Allgemeinen Tabellenausdruck. Mein Grund für dieses ist, dass, während Sie könnte implementieren die Logik der Anwendung auf die Seite, das würde auch die übermittlung der Zwischenergebnisse über den Draht für die Berechnung in der Anwendung. Mit der DBML-designer die Ansicht, übersetzt in eine Tabelle Person. Sie können dann verknüpfen Sie die Funktion mit der Tabelle Person und die Methode aufrufen, erstellt am DataContext abgeleitet Objekte des Typs durch den view definiert sind. Mit der Tisch-basierte Funktion erlaubt die Abfrage-engine, um Ihr Parameter zu berücksichtigen bei der Konstruktion das Ergebnis eher als das anwenden einer Bedingung auf die Ergebnismenge durch den view definiert sind, nach der Tat.
Verwenden, Sie würde so etwas machen-vorausgesetzt, einige vernünftige Namensschema:
Diese option könnte auch als nützlich erweisen:
LINQ AsHierarchy () - Erweiterungsmethode
http://www.scip.be/index.php?Page=ArticlesNET18
Ich bin überrascht, niemand erwähnt hat, eine alternative Datenbank-design - bei der Hierarchie reduziert werden muss aus mehreren Ebenen und abgerufen werden, mit hoher Leistung (nicht so bedenkt, Speicherplatz) ist es besser, auf eine andere Person-2-Person-Tabelle zu verfolgen, Hierarchie statt parent_id Ansatz.
Wird es erlauben, nicht nur single-Eltern-Beziehungen, sondern auch multi-parent-Beziehungen, Ebene Indikationen und verschiedene Arten von Beziehungen:
Ich dies getan haben, zwei Möglichkeiten:
Diese Erweiterung Methode könnte möglicherweise geändert werden, um IQueryable. Ich habe es erfolgreich in der Vergangenheit auf eine Sammlung von Objekten. Es kann funktionieren, für Ihr Szenario.
Hier ist, wie ich es nannte:
Dieser code ist eine verbesserte, ein bug-Fix-version des code gefunden hier.
In MS SQL 2008, die Sie nutzen könnten HierarchyID direkt in sql2005 können Sie umsetzen müssen Sie Sie manuell. ParentID ist nicht performant mit großen Datenmengen. Überprüfen Sie auch dieser Artikel weitere Diskussion über das Thema.
Ich habe diesen Ansatz aus Rob Conery s blog (überprüfen Sie rund um Pt. 6 für diesen code, auch auf codeplex) und ich Liebe es zu benutzen. Dies könnte refashioned Unterstützung für mehrere "sub" - Ebenen.
Die Probleme mit dem abrufen der Daten von der client-Seite ist, dass man nie sicher sein kann, wie tief Sie gehen müssen. Diese Methode wird eine hin-und Rückfahrkarte pro Tiefe und könnte es sein, die union würde zu tun, von 0 bis zu einer bestimmten Tiefe in eine hin-und Rückfahrkarte.
Kann es allerdings nicht tun, beliebigen Tiefe. Wenn Sie wirklich erforderlich beliebigen Tiefe, die Sie benötigen, zu tun, dass in der Datenbank - so können Sie die richtige Entscheidung, zu stoppen.
Lesen Sie bitte den folgenden link.
http://support.microsoft.com/default.aspx?scid=kb;en-us;q248915