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
Susan SarandonOriginal
2025-01-14 10:14:46644Durchsuche

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:

<code class="language-c#">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);
}</code>

Lösung:

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

<code class="language-c#">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);
}</code>

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!

Stellungnahme:
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