Heim > Backend-Entwicklung > C++ > Wie implementiert man eine generische Erweiterungsmethode für die dynamische Sortierung in IQueryable mithilfe von String-Spaltennamen?

Wie implementiert man eine generische Erweiterungsmethode für die dynamische Sortierung in IQueryable mithilfe von String-Spaltennamen?

Mary-Kate Olsen
Freigeben: 2025-01-14 09:45:43
Original
877 Leute haben es durchsucht

How to Implement a Generic Extension Method for Dynamic Sorting on IQueryable Using String Column Names?

Generische Erweiterungsmethode zum dynamischen Sortieren von IQueryable mithilfe von String-Spaltennamen

In diesem Artikel wird untersucht, wie eine generische Erweiterungsmethode ApplySortFilter implementiert wird, die eine dynamische Sortierung einer IQueryable-Sammlung mithilfe von Zeichenfolgenspaltennamen ermöglicht. Das Kernproblem besteht darin, zur Laufzeit den richtigen Typ für die OrderBy-Methode anzugeben.

Erster Versuch

Die ursprüngliche Implementierung versucht, den Typ des sortExpression-Ausdrucks aus OrderBy wie folgt abzuleiten:

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

Allerdings kann TSortColumn nur dynamisch bestimmt werden, was diesen Ansatz undurchführbar macht.

Eine praktikable Lösung

In einem ähnlichen LINQ to SQL-Projekt wurde eine Lösung gefunden:

<code class="language-csharp">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;

    // 确定排序方向
    if (ordering.StartsWith("-"))
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }
    else
    {
        resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    }

    // 创建并返回查询
    return source.Provider.CreateQuery<T>(resultExp);
}</code>
Nach dem Login kopieren

Anleitung

Um diese Methode zu verwenden, geben Sie den zu sortierenden Spaltennamen als Zeichenfolge an:

<code class="language-csharp">IQueryable<MyEntity> query = db.MyEntities.OrderBy("Name");</code>
Nach dem Login kopieren

Dadurch wird eine Abfrage generiert, die in aufsteigender Reihenfolge nach der Spalte „Name“ sortiert ist.

Diese überarbeitete Ausgabe bietet eine prägnantere und technisch genauere Beschreibung des Codes und seines Zwecks, während das Originalbild beibehalten wird. Außerdem wurde die Formatierung für die Lesbarkeit verbessert.

Das obige ist der detaillierte Inhalt vonWie implementiert man eine generische Erweiterungsmethode für die dynamische Sortierung in IQueryable mithilfe von String-Spaltennamen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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