LINQ Gruppierung dynamisch

8

Ich habe eine Klassenliste von Datensätzen, sodass Benutzer auswählen können, um Zeilen dynamisch nach Eigenschaftennamen zu gruppieren. Zum Beispiel MenuText , RoleName oder ActionName . Dann muss ich die Gruppierung ausführen, also brauche ich eine generische Methode, um die Gruppierung durch Übergabe des Spaltennamens zu handhaben.

Beispiel:

%Vor%     
ineffable p 16.07.2013, 13:42
quelle

5 Antworten

15

Wenn Sie nicht mit einer Datenbank arbeiten, können Sie Reflection verwenden:

%Vor%

Verwendet als:

%Vor%

Dies ist eine ziemlich rohe Lösung, ein besserer Weg sollte es sein, Dynamischer LINQ :

%Vor%

BEARBEITEN Dynamisch LINQ braucht vielleicht einige Erklärungen. Es ist keine Technologie, keine Bibliothek oder ein brandneuer Rahmen. Es ist nur ein praktischer Name für ein Paar (2000 LOC) von Helfern Methoden, mit denen Sie solche Abfragen schreiben können. Laden Sie einfach ihre Quelle herunter (wenn Sie keine VS-Beispiele installiert haben) und verwenden Sie sie in Ihrem Code.

    
Adriano Repetti 16.07.2013, 13:48
quelle
3

Einfachster Weg:

%Vor%

Sie können auch Ausdrucksbäume verwenden.

%Vor%

Dies erzeugt ein Lambda menu => menu.<PropertyName> .

Aber es ist nicht wirklich ein Unterschied, bis die Klasse aufgebläht ist.

    
Romoku 16.07.2013 13:47
quelle
2

Der folgende Ansatz würde sowohl mit LINQ zu Objects als auch mit LINQ zu EF / NHibernate / etc. funktionieren Es erstellt einen Ausdruck, der der Spalte / Eigenschaft entspricht, die als Zeichenfolge übergeben wurde, und übergibt diesen Ausdruck an GroupBy :

%Vor%

Verwendung mit IQueryable<T> basierten Datenquellen:

%Vor%

Verwendung mit IEnumerable<T> basierten Datenquellen:

%Vor%

BTW: Der Rückgabetyp Ihrer Methode sollte IEnumerable<IGrouping<string, Menu>> sein, weil ein IGrouping<string, Menu> bereits bedeutet, dass es mehrere Menu Instanzen pro Schlüssel geben kann.

    
Daniel Hilgarth 16.07.2013 14:01
quelle
0

Ich habe dies mit Dynamic Linq gemacht, wie von Adriano vorgeschlagen

%Vor%     
ineffable p 16.07.2013 14:25
quelle
0

Ihre Lösung ist für jedes Modell einfach zu implementieren, ich habe es einfach generisch gemacht.

%Vor%

so genannt wie unten

%Vor%

Vielen Dank für die Hilfe.

    
ineffable p 16.07.2013 14:37
quelle

Tags und Links