In den VS2008-Beispielen für Dynamic LINQ habe ich ein Beispiel gefunden , mit dem Sie eine SQL-ähnliche Zeichenfolge verwenden können (z OrderBy("Name, Age DESC"))
. B. zum Bestellen. Leider funktioniert die enthaltene Methode nur IQueryable<T>
. Gibt es eine Möglichkeit, diese Funktionalität zu aktivieren IEnumerable<T>
?
c#
linq
linq-to-objects
John Sheehan
quelle
quelle
Antworten:
Bin gerade in diesen Oldie gestolpert ...
Um dies ohne die dynamische LINQ-Bibliothek zu tun, benötigen Sie nur den folgenden Code. Dies umfasst die häufigsten Szenarien, einschließlich verschachtelter Eigenschaften.
Um es zum Laufen zu bringen, können
IEnumerable<T>
Sie einige Wrapper-Methoden hinzufügen, die überAsQueryable
- aber der folgende Code ist dieExpression
Kernlogik, die benötigt wird.Bearbeiten: Es macht mehr Spaß, wenn Sie dies mit mischen möchten
dynamic
- obwohl der Hinweisdynamic
nur für LINQ-to-Objects gilt (Ausdrucksbäume für ORMs usw. könnendynamic
Abfragen nicht wirklich darstellen - unterstütztMemberExpression
dies nicht). Aber hier ist eine Möglichkeit, dies mit LINQ-to-Objects zu tun. Beachten Sie, dass die Auswahl vonHashtable
auf eine günstige Sperrsemantik zurückzuführen ist:quelle
IQueryable<T>
, also wenn Sie etwas wieList<T>
(was istIEnumerable<T>
) haben, müssen Sie möglicherweiseAsQueryable()
- zum Beispielvar sorted = someList.AsQueryable().OrderBy("Foo.Bar");
Zu einfach ohne Komplikationen:
using System.Linq.Dynamic;
Oben hinzufügen .vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
quelle
System.Linq.Dynamic
?Ich habe die Antwort gefunden. Ich kann die
.AsQueryable<>()
Erweiterungsmethode verwenden, um meine Liste in IQueryable zu konvertieren und dann die dynamische Reihenfolge danach auszuführen.quelle
Bin gerade über diese Frage gestolpert.
Mit der ApplyOrder-Implementierung von Marc von oben habe ich eine Erweiterungsmethode zusammengestellt, die SQL-ähnliche Zeichenfolgen wie folgt verarbeitet:
Details finden Sie hier: http://aonnull.blogspot.com/2010/08/dynamic-sql-like-linq-orderby-extension.html
quelle
Ich denke, es würde funktionieren, Reflexion zu verwenden, um die Eigenschaft zu erhalten, nach der Sie sortieren möchten:
Beachten Sie, dass die Verwendung der Reflexion erheblich langsamer ist als der direkte Zugriff auf die Eigenschaft, sodass die Leistung untersucht werden muss.
quelle
Bauen Sie einfach auf dem auf, was andere gesagt haben. Ich fand, dass das folgende ziemlich gut funktioniert.
quelle
Ich bin über diese Frage gestolpert und habe nach Linq-Multiple-Orderby-Klauseln gesucht. Vielleicht hat der Autor danach gesucht
So geht's:
quelle
Ich habe versucht, dies zu tun, hatte aber Probleme mit der Lösung von Kjetil Watnedal, weil ich nicht die Inline-Linq-Syntax verwende - ich bevorzuge eine Syntax im Methodenstil. Mein spezielles Problem bestand darin, eine dynamische Sortierung mithilfe eines benutzerdefinierten Objekts durchzuführen
IComparer
.Meine Lösung endete so:
Bei einer IQueryable-Abfrage wie folgt:
Und gegeben ein Laufzeitsortierfeldargument:
Das dynamische OrderBy sieht so aus:
Und das mit einer kleinen Hilfsmethode namens GetReflectedPropertyValue ():
Eine letzte Sache - ich erwähnte, dass ich die
OrderBy
benutzerdefinierte verwenden wollteIComparer
- weil ich natürliche Sortierung durchführen wollte .Um das zu tun, ändere ich einfach Folgendes
OrderBy
:In diesem Beitrag finden Sie den Code für
NaturalSortComparer()
.quelle
Verwenden Sie dynamisch
linq
einfach hinzufügen
using System.Linq.Dynamic;
Und verwenden Sie es so, um alle Ihre Spalten zu bestellen:
quelle
Sie könnten es hinzufügen:
Die
GetPropertyValue
Funktion stammt aus der Antwort von Kjetil WatnedalDas Problem wäre, warum? Eine solche Sortierung würde zur Laufzeit Ausnahmen auslösen und nicht zur Kompilierungszeit (wie die Antwort von D2VIANT).
Wenn Sie mit Linq to Sql arbeiten und das orderby ein Ausdrucksbaum ist, wird es ohnehin zur Ausführung in SQL konvertiert.
quelle
OrderBy
Behalte die vorherige Bestellung nicht bei !!Hier ist noch etwas, das ich interessant fand. Wenn Ihre Quelle eine DataTable ist, können Sie die dynamische Sortierung ohne Verwendung von Dynamic Linq verwenden
Referenz: http://msdn.microsoft.com/en-us/library/bb669083.aspx (Verwenden von DataSetExtensions)
Hier ist eine weitere Möglichkeit, dies durch Konvertieren in eine DataView zu tun:
quelle
Dank Maarten ( Abfrage einer Sammlung mit dem PropertyInfo-Objekt in LINQ ) habe ich folgende Lösung erhalten:
In meinem Fall habe ich an einem "ColumnHeaderMouseClick" (WindowsForm) gearbeitet, also habe ich gerade die bestimmte Spalte gedrückt und ihre entsprechende PropertyInfo gefunden:
ODER
(Stellen Sie sicher, dass Ihre Spaltennamen mit den Objekteigenschaften übereinstimmen.)
Prost
quelle
Nach langem Suchen hat das bei mir funktioniert:
quelle
Sie können die IEnumerable in IQueryable konvertieren.
quelle
Eine alternative Lösung verwendet die folgende Klasse / Schnittstelle. Es ist nicht wirklich dynamisch, aber es funktioniert.
quelle
Diese Antwort ist eine Antwort auf die Kommentare, die ein Beispiel für die von @John Sheehan - Runscope bereitgestellte Lösung benötigen
in DAL (Datenzugriffsschicht),
Die IEnumerable-Version:
Die IQueryable-Version
Jetzt können Sie die IQueryable-Version zum Binden verwenden, z. B. GridView in Asp.net, und Vorteile beim Sortieren erzielen (Sie können nicht mit der IEnumerable-Version sortieren).
Ich habe Dapper als ORM verwendet und eine IQueryable-Version erstellt und das Sortieren in GridView in asp.net so einfach verwendet.
quelle
Installieren Sie zuerst Dynamic Tools -> NuGet Package Manager -> Package Manager Console
In Namespace
using System.Linq.Dynamic;
Jetzt können Sie verwenden
OrderBy("Name, Age DESC")
quelle
Sie können dies verwenden:
quelle
Konvertieren Sie die Liste in IEnumerable oder Iquerable, fügen Sie sie mit dem System.LINQ.Dynamic-Namespace hinzu. Anschließend können Sie die Eigenschaftsnamen in einer durch Kommas getrennten Zeichenfolge für die OrderBy-Methode angeben, die standardmäßig von System.LINQ.Dynamic stammt.
quelle
quelle