首页 > 后端开发 > C++ > 如何在 LINQ OrderBy 子句中动态指定排序属性?

如何在 LINQ OrderBy 子句中动态指定排序属性?

Barbara Streisand
发布: 2025-01-10 11:53:43
原创
600 人浏览过

How Can I Dynamically Specify the Sort Property in a LINQ OrderBy Clause?

使用动态参数自定义LINQ中的OrderBy表达式

LINQ 的 OrderBy 扩展方法允许您根据一个或多个属性对对象集合进行排序。但是,如何使用作为参数传入的值来指定要排序的属性呢?

背景:

以下代码展示了 OrderBy 的基本用法,其中属性是硬编码的:

<code class="language-csharp">List<student> existingStudends = new List<student>{ new Student {...}, new Student {...}};
List<student> orderbyAddress = existingStudends.OrderBy(c => c.Address).ToList();</code>
登录后复制

动态属性指定:

为了动态指定要排序的属性,您可以利用反射来构建必要的表达式树。这是一个实现此功能的扩展方法:

<code class="language-csharp">public static IQueryable<TEntity> OrderBy<TEntity>(this IQueryable<TEntity> source, string orderByProperty, bool desc)
{
    string command = desc ? "OrderByDescending" : "OrderBy";
    var type = typeof(TEntity);
    var property = type.GetProperty(orderByProperty);
    var parameter = Expression.Parameter(type, "p");
    var propertyAccess = Expression.MakeMemberAccess(parameter, property);
    var orderByExpression = Expression.Lambda(propertyAccess, parameter);
    var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType },
                                   source.Expression, Expression.Quote(orderByExpression));
    return source.Provider.CreateQuery<TEntity>(resultExpression);
}</code>
登录后复制

其中 orderByProperty 是您要排序的属性名称,desc 确定是按降序 (true) 排序还是按升序 (false) 排序。

用法:

使用此扩展方法,您现在可以动态地按任何属性排序:

<code class="language-csharp">string param = "City";
List<student> orderbyAddress = existingStudends.OrderBy("City", true).ToList(); // 按城市降序排序
List<student> orderbyName = existingStudends.OrderBy("Name", false).ToList(); // 按名称升序排序</code>
登录后复制

以上是如何在 LINQ OrderBy 子句中动态指定排序属性?的详细内容。更多信息请关注PHP中文网其他相关文章!

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