public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
where T : EntityObject
{
var param = Expression.Parameter(typeof(T), "o");
var body = Expression.PropertyOrField(param,columnName);
var sortExpression = Expression.Lambda(body, param);
return query.OrderBy(sortExpression);
}
Da der Typ für OrderBy nicht von sortExpression abgeleitet ist, muss ich ihn zur Laufzeit wie folgt angeben:
var sortExpression = Expression.Lambda<T, TSortColumn>(body, param);
Oder
return query.OrderBy<T, TSortColumn>(sortExpression);
Ich denke jedoch nicht, dass dies möglich ist, da TSortColumn nur zur Laufzeit ermittelt werden kann.
Gibt es einen Weg, dies zu umgehen?
Antworten:
Wir haben in einem LINQ to SQL-Projekt etwas Ähnliches (nicht 100% gleich, aber ähnlich) gemacht. Hier ist der Code:
Wir haben eigentlich kein Generikum verwendet, wir hatten eine bekannte Klasse, aber es sollte auf einem Generikum funktionieren (ich habe den generischen Platzhalter dort platziert, wo er sein sollte).
Bearbeiten: Bei absteigender Reihenfolge
OrderByDescending
anstelle von "OrderBy" übergeben:quelle
values
?Sie können auch Dynamic Linq verwenden
Infos hier http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
C # hier herunterladen http://msdn.microsoft.com/en-us/vcsharp/bb894665.aspx
Fügen Sie dann einfach die using Linq.Dynamic hinzu; und Sie erhalten automatisch 2 zusätzliche Erweiterungsmethoden, die wie folgt verwendet werden können
quelle
Ich habe Ihre Funktionen erweitert, um Unterstützung für untergeordnete Eigenschaften hinzuzufügen.
Sie können diese Funktionen wie folgt verwenden:
quelle
Ich habe Ihre Idee für die Erweiterungsmethode für OrderBy verwendet. Aber im Fall von "vielen zu vielen" bekomme ich Fehler. Zum Beispiel haben Sie die Tabelle Site, Customer und Customer_site. Für eine bestimmte Site möchte ich nach dem Kundennamen und in der OrderBy-Erweiterung sortieren (wenn ich "site.customer" übergebe, wo der Kunde die Navigationseigenschaft ist), erhalte ich die folgende Fehlermeldung: propertyAccess = Expression.MakeMemberAccess (propertyAccess, property);
Dies ist, was ich benutze (mit einigen Verbesserungen :-)):
Grüße
Slobodan
quelle
Es scheint, dass dies der richtige Weg ist, um Folgendes zu überprüfen:
quelle
Wenn Sie das Paket "System.Linq.Dynamic" hinzufügen können, ist dies zu einfach und ohne Komplikationen.
Fisrt insatll Paket "System.Linq.Dynamic" von NuGet Paketmanager dann versuchen Sie wie unten, wie Sie benötigen,
Ex:
Hoffe das wird helfen
quelle
Ich habe diesen Code ein wenig korrigiert : https://stackoverflow.com/a/1670085/5852630
Dieser Code funktioniert mit sequentieller Sortierung: Führen Sie zuerst "OrderBy" und dann "ThenBy" aus (nicht "OrderBy"!)
quelle
Hier ist meine Adaption von @Davy Landmans Antwort (ich wollte eine Erweiterungsmethode) und ich habe sie ein wenig vereinfacht.
Es kann folgendermaßen verwendet werden:
quelle