使用OrderBy动态排序LINQ结果
问题:
如何根据参数动态指定传递给OrderBy方法的参数?
详情:
假设您有一个学生列表,并希望按特定属性对其进行排序。当前实现使用硬编码属性名称,但是如何将属性名称作为参数传递呢?
示例:
<code class="language-C#">string param = "City"; List<student> orderByAddress = existingStudents.OrderByDescending(c => param).ToList();</code>
解决方案:
解决方案涉及使用反射动态构建表达式树。可以创建一个扩展方法,如下所示:
<code class="language-C#">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
确定排序顺序。
用法:
现在,您可以动态排序学生列表:
<code class="language-C#">existingStudents.OrderBy("City", true); // 按城市降序排序 existingStudents.OrderBy("City", false); // 按城市升序排序</code>
以上是如何使用 OrderBy 动态排序 LINQ 结果?的详细内容。更多信息请关注PHP中文网其他相关文章!