擴充OrderBy,使用泛型參數進行字串列排序
如何在泛型擴充方法中使用字串列名對IQueryable進行排序?我們現有的方法ApplySortFilter<T, TResult>
存在不足,因為它需要在運行時指定OrderBy的類型,這是不可行的。
問題:
<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>
解:
為了克服這個限制,我們需要從sortExpression
推論OrderBy的型別。這是一個修改後的實作:
<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>
這個修改後的方法動態地推斷被排序屬性的類型,並正確地應用OrderBy操作。
關於降序排序的說明:
對於降序排序,只需在MethodCallExpression
中將「OrderBy」替換為「OrderByDescending」。
以上是如何使用 IQueryable 的 OrderBy 實作通用字串列排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!