本文探讨如何实现一个泛型扩展方法 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中文网其他相关文章!