本文探討如何實作一個泛型擴充方法 ApplySortFilter
,允許使用字串列名對 IQueryable
集合進行動態排序。核心問題在於如何在運行時為 OrderBy
方法指定正確的類型。
最初的實作嘗試從 sortExpression
推論 OrderBy
表達式的類型,如下所示:
<code>var sortExpression = Expression.Lambda<Func<T, TSortColumn>>(body, param);</code>
然而,TSortColumn
只能動態決定,使得這種方法不可行。
在一個類似的 LINQ to SQL 專案中,找到了一個解決方案:
<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>
要使用此方法,您可以將要排序的列名指定為字串:
<code class="language-csharp">IQueryable<MyEntity> query = db.MyEntities.OrderBy("Name");</code>
這將產生一個按 Name 列升序排序的查詢。
This revised output provides a more concise and technically accurate description of the code and its purpose, while maintaining the original image. The formatting is also improved for readability.
以上是如何使用字串列名在 IQueryable 上實現動態排序的通用擴充方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!