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%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.
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
:
Verwendung mit IQueryable<T>
basierten Datenquellen:
Verwendung mit IEnumerable<T>
basierten Datenquellen:
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.
Ich habe dies mit Dynamic Linq gemacht, wie von Adriano vorgeschlagen
%Vor%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.