Heim > Backend-Entwicklung > C++ > Wie ordne ich ein IQueryable dynamisch mithilfe eines String-Spaltennamens in einer generischen Erweiterungsmethode an?

Wie ordne ich ein IQueryable dynamisch mithilfe eines String-Spaltennamens in einer generischen Erweiterungsmethode an?

Mary-Kate Olsen
Freigeben: 2025-01-14 07:17:42
Original
342 Leute haben es durchsucht

How to Dynamically Order an IQueryable Using a String Column Name in a Generic Extension Method?

OrderBy auf IQueryable anwenden

in der generischen Erweiterungsmethode unter Verwendung des String-Spaltennamens

Beim Versuch, OrderBy mithilfe eines String-Spaltennamens in einer generischen Erweiterungsmethode auf ein IQueryable anzuwenden, stießen wir auf eine Herausforderung. Der Typ von OrderBy kann nicht aus sortExpression abgeleitet werden und muss zur Laufzeit explizit angegeben werden.

Eine Möglichkeit besteht darin, sortExpression als Lambda-Ausdruck eines bestimmten Typs zu definieren:

<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
Nach dem Login kopieren

Dieser Ansatz erfordert jedoch die Kenntnis des TSortColumn-Typs zur Kompilierungszeit, was nicht immer möglich ist.

Um diese Einschränkung zu überwinden, können wir eine Technik nutzen, die der im LINQ to SQL-Projekt verwendeten ähnelt. Hier ist ein geänderter Codeausschnitt:

public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) {
    var type = typeof(T);
    var property = type.GetProperty(ordering);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExp = Expression.Lambda(propertyAccess, parameter);
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    return source.Provider.CreateQuery<T>(resultExp);
}
Nach dem Login kopieren

Mit dieser Methode können Sie die zu sortierenden Eigenschaften mithilfe des Parameters für die Zeichenfolgenreihenfolge dynamisch angeben. Für die absteigende Sortierung verwenden Sie einfach „OrderByDescending“ anstelle von „OrderBy“ im MethodCallExpression.

Diese verbesserte Version bietet eine prägnantere Erklärung und vermeidet unnötige Wiederholungen. Der Code bleibt funktional identisch.

Das obige ist der detaillierte Inhalt vonWie ordne ich ein IQueryable dynamisch mithilfe eines String-Spaltennamens in einer generischen Erweiterungsmethode an?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage