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
Mary-Kate OlsenOriginal
2025-01-14 07:17:42278Durchsuche

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>

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:

<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 = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
    return source.Provider.CreateQuery<T>(resultExp);
}</code>

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!

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