Alle Kinder auf eine Liste bringen - Rekursives C #

8

C # | .NET 4.5 | Entity Framework 5

Ich habe eine Klasse in Entity Framework, die so aussieht:

%Vor%

ID ist die Kennung des Standorts, ParentID verknüpft sie mit einem übergeordneten Element und Children enthält alle untergeordneten Standorte des übergeordneten Standorts. Ich suche nach einer einfachen Möglichkeit, wahrscheinlich rekursiv, um alle "Location" und ihre Kinder in eine einzige Liste mit den Location.IDs zu bekommen. Ich habe Probleme, dies rekursiv zu verstehen. Jede Hilfe wird geschätzt.

Das ist was ich bisher habe, es ist eine Erweiterung der Entity-Klasse, aber ich glaube, es könnte besser / einfacher gemacht werden:

%Vor%

AKTUALISIERT

Ich schrieb die Rekursion in SQL, warf diese in ein SP und zog sie dann in Entity. Schien sauberer und einfacher für mich als Linq, und nach den Kommentaren Linq und Entity zu beurteilen scheinen nicht der beste Weg zu gehen. Danke für die Hilfe!

    
Will 08.10.2013, 02:03
quelle

7 Antworten

10

Sie können SelectMany

ausführen %Vor%

Sie können die Bedingung für einige selektive Ergebnisse wie

verwenden %Vor%

Wenn Sie nur IDs von Kindern benötigen, können Sie dies tun

%Vor%     
Nikhil Agrawal 08.10.2013, 02:07
quelle
11

Versuchen Sie diese Erweiterungsmethode:

%Vor%

Und Sie können es so verwenden:

%Vor%     
Jonathas Costa 10.01.2014 20:45
quelle
4

Das Entitätsframework unterstützt derzeit keine Rekursion, und aus diesem Grund können Sie entweder

  • Verlassen Sie sich auf das Laden von untergeordneten Sammlungen, wie Sie es getan haben (achten Sie auf das N + 1-Problem)
  • Abfrage einer beliebigen Tiefe von Objekten (Dies ist eine hässliche Abfrage, obwohl Sie sie mit System.Linq.Expressions erzeugen könnten)

Die einzige wirkliche Option wäre, LINQ zu vermeiden, um die Abfrage auszudrücken, und stattdessen auf Standard-SQL zurückzugreifen.

Entity-Framework unterstützt dieses Szenario ziemlich gut, ob Sie Code zuerst verwenden oder nicht.

Berücksichtigen Sie für Code zuerst etwas in der Art von

%Vor%

Verwenden Sie für das Modell zuerst eine definierende Abfrage < Ich halte das für eine gute Option, da es weitere Kompositionen oder gespeicherte Prozeduren erlaubt.

Um rekursiv Daten zurückzuerhalten, müssen Sie rekursive CTEs verstehen, vorausgesetzt, Sie verwenden SQL Server und Version 2005 +

BEARBEITEN:

Hier ist der Code für eine rekursive Abfrage auf eine beliebige Tiefe. Ich stelle das nur zum Spaß zusammen, ich bezweifle, dass es sehr effizient wäre!

%Vor%

Die abgeflachte Liste befindet sich in der Variablenabfrage

    
Martin Booth 08.10.2013 02:43
quelle
3

Ich möchte meine eigene Lösung vorstellen, die aus den folgenden Referenzen modifiziert wurde:

%Vor%

Beispiel:

%Vor%

Ausgabe:

  • Dominic
  • Bretagne

Klasse:

%Vor%

Ref. Ссылка

Hinweis: Die andere Referenz kann nicht gefunden werden, aber eine andere Person auf SO hat eine Antwort veröffentlicht, von der ich etwas Code kopiert habe.

    
user1477388 04.08.2015 18:33
quelle
3

Das wird den Trick machen:

%Vor%

Benutze es so:

%Vor%     
GreatAndPowerfulOz 08.03.2017 20:07
quelle
1

Ich hatte keine Children Stütze in meinem Modell, also funktioniert die Antwort von Nikhil Agrawal nicht für mich, also hier ist meine Lösung.

Mit folgendem Modell:

%Vor%

Sie können unter Verwendung von:

Kinder von einem Element erhalten %Vor%

Zum Beispiel

%Vor%     
Mehdi Dehghani 04.02.2018 10:02
quelle
0

Wenn Locations in Ihrem DB-Kontext ein DbSet<Location> ist, löst dies Ihr Problem. "Ich suche nach einem einfachen Weg ... alle" Location "und ihre Kinder in eine einzige Liste mit dem Standort zu bringen .IDs ". Scheint so, als ob ich etwas verpasse, also bitte geklärt, wenn es so ist.

%Vor%     
Moho 08.10.2013 02:21
quelle