LINQ OrderBy 参数的动态指定
在需要动态指定 LINQ OrderBy 操作中使用的字段的场景中,可以使用反射技术来实现。
示例:
假设存在一个学生列表 existingStudents
和一个表示要排序的字段的参数 param
。
<code class="language-csharp">List<student> existingStudents = new List<student> { ... }; string param = "City";</code>
标准实现:
默认方法使用硬编码属性名称调用 OrderBy 进行排序:
<code class="language-csharp">List<student> orderedByAddress = existingStudents.OrderBy(c => c.Address).ToList();</code>
动态实现:
使用反射,可以创建一个动态表达式:
<code class="language-csharp">public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string orderByProperty, bool desc) { // 确定排序表达式 string command = desc ? "OrderByDescending" : "OrderBy"; var type = typeof(T); 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<T>(resultExpression); }</code>
使用方法:
现在可以使用 OrderBy 扩展方法按任何属性动态排序:
<code class="language-csharp">List<student> orderbyAddress = existingStudents.OrderBy("City", true); // 降序 List<student> orderbyName = existingStudents.OrderBy("Name", false); // 升序</code>
以上是如何在LINQ中动态指定OrderBy字段?的详细内容。更多信息请关注PHP中文网其他相关文章!