扩展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中文网其他相关文章!