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.
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>
Allerdings kann TSortColumn
nur dynamisch bestimmt werden, was diesen Ansatz undurchführbar macht.
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>
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>
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!