linq to sql rekursive Abfrage
EmployeeId Name ManagerId
------------------------------
1 A null
2 B null
3 C 1
4 D 3
5 E 2
nur mit Hilfe dieser Tabelle, wie kann eine linq-Abfrage (unter Verwendung von linq to sql) geschrieben werden, zum abrufen der übergeordneten Daten rekursiv.
Zum Beispiel, wenn der Arbeitgeber-Id ausgewählt ist 4 sollte es geben, Liste der Mitarbeiter mit der Id: 4, 3, 1
Dank.
- 4,3,1?? Welche Art von Algorithmus, sagen Sie? 🙂 Was passiert, Wenn ich wählen Sie 5?
- Das sollte Ihnen eine Liste der Mitarbeiter(s) mit id: 5, 2
- Ich kann immer noch nicht verstehen. 2 ist managerId? Wenn ja, so wie ich das verstehe. Sie wollen ausgewählte EmployeeId und diese EmployeeId ist managerId EmployeeId ?
- Es muss rekursiv abrufen der übergeordneten Daten. Also, wenn 4 ist der ausgewählte Mitarbeiter-id, es wird gehen, und wählen Sie 3 (4-manager-id), und dann gehen Sie und wählen Sie 1 (3 manager-id). Da 1 keinen manager-id, es wird aufhören und zurück 4,3, und 1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese .AsHierarchy () - Erweiterungsmethode können hilfreich sein: link. Allerdings funktioniert dies nur, indem Sie eine einfache Möglichkeit, um werfen Sie Ihre Ergebnisse in der verknüpften Objekte. Um das zu tun, es wird nur erhalten Sie alle Datensätze und führen Sie Ihre eigene lokale rekursive Abfrage.
Wenn Sie suchen für eine LINQ-Abfrage wird direkt übersetzen, um eine rekursive SQL-Abfragen über LINQ to SQL nicht finden. Für die beste Leistung, ein allgemeiner Tabellenausdruck in einer gespeicherten Prozedur ist wahrscheinlich das, was du bist suchen für. Wenn Sie eine wirklich einfache Seite, der laden muss den ganzen Baum sowieso, die AsHierarchy Methode würde wahrscheinlich passen Ihre Bedürfnisse.
Ich bin mir nicht sicher, ob dies ist genau das, was Sie wollen, aber hier ist eine rekursive Methode verwendet linq, das sicherstellt, dass nicht eine unendliche Schleife eingeben:
Wenn Sie linqpad installiert ist, können Sie testen Sie dies mit dem folgenden Skript:
Könnten Sie etwas tun, wie
aber es ist eine ziemlich gefährliche Sache, da es bekommen kann stecken in einer unendlichen Schleife. Soweit ich weiss, gibt es keinen Weg, um eine rekursive Abfrage wird direkt, es sei denn, Sie eine gespeicherte Prozedur schreiben.
Wenn Sie möchten, den ganzen Baum auf einmal, die Lösung ist komplexer. In SQL sein, am besten mit einem CTE, ich weiß nicht, ob EF kann damit umgehen ist die Verwendung von linq - eher eine iterative Lösung verwendet werden würde.