Heim > Backend-Entwicklung > C++ > Wie implementiert man die generische String-Spaltensortierung mit OrderBy von IQueryable?

Wie implementiert man die generische String-Spaltensortierung mit OrderBy von IQueryable?

Susan Sarandon
Freigeben: 2025-01-14 10:14:46
Original
702 Leute haben es durchsucht

How to Implement Generic String Column Sorting with IQueryable's OrderBy?

OrderBy erweitern, um generische Parameter für die Sortierung von Zeichenfolgenspalten zu verwenden

Wie sortiere ich IQueryable mithilfe von String-Spaltennamen in der generischen Erweiterungsmethode? Unsere bestehende Methode ApplySortFilter<T, TResult> weist Mängel auf, da sie die Angabe des OrderBy-Typs zur Laufzeit erfordert, was nicht möglich ist.

Frage:

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);
}
Nach dem Login kopieren

Lösung:

Um diese Einschränkung zu überwinden, müssen wir den Typ von OrderBy aus sortExpression ableiten. Hier ist eine modifizierte Implementierung:

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

Diese modifizierte Methode leitet dynamisch den Typ der bestellten Eigenschaft ab und wendet die OrderBy-Operation korrekt an.

Hinweise zur Sortierung in absteigender Reihenfolge:

Für eine absteigende Sortierung ersetzen Sie einfach „OrderBy“ durch „OrderByDescending“ in MethodCallExpression.

Das obige ist der detaillierte Inhalt vonWie implementiert man die generische String-Spaltensortierung mit OrderBy von IQueryable?. 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