Erweitern Sie die OrderBy-Methode von IQueryable mit generischen Spaltennamen
In diesem Artikel wird untersucht, wie man IQueryable mit einer generischen Erweiterungsmethode erweitert, sodass es basierend auf einem bestimmten String-Spaltennamen sortiert werden kann.
Erwägen Sie die folgenden Erweiterungsmethoden:
<code class="language-csharp">public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName) where T : EntityObject</code>
Um die Sortierfunktion zu implementieren, müssen wir einen Ausdruck unter Verwendung des angegebenen Spaltennamens erstellen. Wir sind jedoch auf ein Problem gestoßen: Der aus dem Ausdruck abgeleitete Sortiertyp stimmte nicht mit dem für die OrderBy-Methode erforderlichen Typ überein.
Dies stellt eine Herausforderung dar, da der Sortiertyp TSortColumn
nur zur Laufzeit bestimmt werden kann. Es gibt jedoch eine Lösung.
Das bereitgestellte Codebeispiel zeigt einen ähnlichen Ansatz:
<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values)</code>
Diese Methode akzeptiert einen Zeichenfolgenparameter ordering
, der den Spaltennamen darstellt. Es generiert dynamisch einen Ausdruck basierend auf dem angegebenen Spaltennamen und dem Lambda-Ausdruck. Der resultierende Ausdruck wird dann verwendet, um ein MethodCallExpression
zu erstellen, das die OrderBy-Methode aufruft.
Abschließend wird source.Provider.CreateQuery<T>
aufgerufen, um das sortierte IQueryable zurückzugeben.
Änderung: Für absteigende Sortierung:
<code class="language-csharp">MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));</code>
Das obige ist der detaillierte Inhalt vonWie kann ich OrderBy von IQueryable mit generischen Spaltennamen erweitern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!