Wie gebe ich das Argument an, das an orderby
einen Wert übergeben wird, den ich als Parameter nehme?
Ex:
List<Student> existingStudends = new List<Student>{ new Student {...}, new Student {...}}
Derzeitige Implementierung:
List<Student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();
Statt c.Address
, wie kann ich das als Parameter übernehmen?
Beispiel
string param = "City";
List<Student> orderbyAddress = existingStudends.OrderByDescending(c => param).ToList();
OrderBy
handelt es sich um eine Linq-Funktion, die aktiviert ist undIEnumerable
keine spezifische Funktion fürList
. Fühlen Sie sich frei, die Bearbeitung zurückzusetzen oder weiter zu ändern :)Antworten:
Hier ist eine Möglichkeit mit Reflexion ...
quelle
ThenBy
Methode .Sie können den Ausdrucksbaum mit ein wenig Reflexion wie folgt erstellen (dies ist eine Erweiterungsmethode):
orderByProperty
ist der Eigenschaftsname, nach dem Sie bestellen möchten, und wenn er als Parameter für true übergeben wirddesc
, wird er in absteigender Reihenfolge sortiert. Andernfalls wird in aufsteigender Reihenfolge sortiert.Jetzt sollten Sie in der Lage sein
existingStudents.OrderBy("City",true);
oderexistingStudents.OrderBy("City",false);
quelle
Um die Antwort von @Icarus zu erweitern : Wenn der Rückgabetyp der Erweiterungsmethode ein IOrderedQueryable anstelle eines IQueryable sein soll, können Sie das Ergebnis einfach wie folgt umwandeln:
quelle
1) Installieren Sie System.Linq.Dynamic
2) Fügen Sie den folgenden Code hinzu
3) Schreiben Sie Ihren Schalter zur Auswahl der Lambda-Funktion
4) Verwenden Sie Ihre Helfer
5) Sie können es mit Pagging verwenden ( PagedList )
Erläuterung
Mit System.Linq.Dynamic können wir den Zeichenfolgenwert in der OrderBy-Methode festlegen. In dieser Erweiterung wird der String jedoch nach Lambda analysiert. Also dachte ich, es würde funktionieren, wenn wir Lambda in einen String analysieren und ihn der OrderBy-Methode geben würden. Und es funktioniert!
quelle
quelle
Hier ist etwas, das ich mir ausgedacht habe, um mit einem bedingten Abstieg umzugehen. Sie können dies mit anderen Methoden zum
keySelector
dynamischen Generieren der Funktion kombinieren .Verwendung:
Beachten Sie, dass Sie diese
.OrderBy
Erweiterung mit einem neuen Parameter auf ein beliebiges IQueryable verketten können.quelle
Dies lässt Sie nicht bestehen
string
, wie Sie in Ihrer Frage gefordert haben, aber es könnte trotzdem für Sie funktionieren.Die
OrderByDescending
Methode benötigt aFunc<TSource, TKey>
, sodass Sie Ihre Funktion folgendermaßen umschreiben können:Es gibt auch andere Überladungen für
OrderByDescending
aExpression<Func<TSource, TKey>>
und / oder aIComparer<TKey>
. Sie können sich auch diese ansehen und herausfinden, ob sie Ihnen etwas Nützliches bieten.quelle
Die einzige Lösung, die für mich funktioniert hat, wurde hier veröffentlicht: https://gist.github.com/neoGeneva/1878868 von neoGeneva.
Ich werde seinen Code erneut veröffentlichen, da er gut funktioniert und ich nicht möchte, dass er in den Interwebs verloren geht!
quelle
Fügen Sie Ihrem Code das Nugget-Paket Dynamite hinzu
Fügen Sie den Namespace Dynamite.Extensions hinzu. Beispiel: using Dynamite.Extensions;
Geben Sie die Reihenfolge nach Abfrage wie bei jeder SQL-Abfrage an. Beispiel: Students.OrderBy ("City DESC, Address"). ToList ();
quelle
Um die Antwort von @Icarus zu erweitern: Wenn Sie nach zwei Feldern sortieren möchten, könnte ich die folgende Funktion ausführen (für ein Feld funktioniert die Antwort von Icarius sehr gut).
Dies ist die Funktion, die der Body für den Lambda-Ausdruck zurückgibt. Er funktioniert mit string und int. Es reicht jedoch aus, weitere Typen hinzuzufügen, damit er je nach den Anforderungen der einzelnen Programmierer funktioniert
Um es zu verwenden, wird Folgendes getan
Wenn es einen besseren Weg gibt, dies zu tun, wäre es großartig, wenn sie ihn teilen
Ich habe es geschafft, es zu lösen dank: Wie kann ich mit Linq einen Lambda-Ausdruck mit mehreren Eigenschaften erstellen?
quelle
Ich bin viel zu spät zur Party, aber keine dieser Lösungen hat bei mir funktioniert. Ich wollte unbedingt System.Linq.Dynamic ausprobieren, aber ich konnte das bei Nuget nicht finden, vielleicht abgeschrieben? In jedem Fall...
Hier ist eine Lösung, die ich gefunden habe. Ich musste dynamisch eine Mischung aus OrderBy , OrderByDescending und OrderBy> ThenBy verwenden .
Ich habe einfach eine Erweiterungsmethode für mein Listenobjekt erstellt, ein bisschen hacky, wie ich weiß ... Ich würde dies nicht empfehlen, wenn es etwas wäre, von dem ich viel gemacht habe, aber es ist gut für eine einmalige.
quelle