首页 > 后端开发 > C++ > 如何使用 IQueryable 的 OrderBy 实现通用字符串列排序?

如何使用 IQueryable 的 OrderBy 实现通用字符串列排序?

Susan Sarandon
发布: 2025-01-14 10:14:46
原创
677 人浏览过

How to Implement Generic String Column Sorting with IQueryable's OrderBy?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板