C# 根据传入字段,多条件动态排序

 

动态排序扩展:

复制代码
public static IOrderedQueryable<T> OrderByMultipleFields<T>(this IQueryable<T> source, string[] orderByProperties, bool[] ascending)
{
    if (orderByProperties == null || orderByProperties.Length == 0)
        throw new ArgumentException("No order by properties specified.", nameof(orderByProperties));
    if (ascending == null || ascending.Length != orderByProperties.Length)
        throw new ArgumentException("The ascending array must have the same length as the orderByProperties array.", nameof(ascending));

    IOrderedQueryable<T> orderedQuery = (IOrderedQueryable<T>)source;
    for (int i = 0; i < orderByProperties.Length; i++)
    {
        string propertyName = orderByProperties[i];
        bool asc = ascending[i];

        ParameterExpression parameter = Expression.Parameter(typeof(T), "x");
        MemberExpression member = Expression.PropertyOrField(parameter, propertyName);
        LambdaExpression orderLambda = Expression.Lambda(member, parameter);

        string methodName = asc ? i == 0 ? "OrderBy" : "ThenBy" : i == 0 ? "OrderByDescending" : "ThenByDescending";
        Type elementType = typeof(T);
        Type keyType = member.Type;

        MethodInfo genericMethod = typeof(Queryable).GetMethods().First(
            method => method.Name == methodName &&
            method.IsGenericMethodDefinition &&
            method.GetParameters().Length == 2);

        MethodInfo constructedMethod = genericMethod.MakeGenericMethod(elementType, keyType);

        orderedQuery = (IOrderedQueryable<T>)constructedMethod.Invoke(null, new object[] { orderedQuery, orderLambda });
    }

    return orderedQuery;
}
View Code
复制代码

 

使用动态排序:

复制代码
var people = new List<Person>
{
    new() { Name = "Charlie", Age = 25, City = "Los Angeles" },
    new() { Name = "Alice", Age = 25, City = "New York" },
    new() { Name = "David", Age = 35, City = "Chicago" },
    new() { Name = "Bob", Age = 30, City = "New York" },
    new() { Name = "Eve", Age = 25, City = "New York" }
};

// 使用LINQ查询来应用动态排序  
var orderByFields = new[] { "Name", "Age" }; // 要排序的字段名数组  
var ascending = new[] { true, false }; // 每个字段的排序方向(升序/降序)数组  

//多条件排序
var sortedPeople = people.AsQueryable()
    .OrderByMultipleFields(orderByFields, ascending)
    .ToList();
View Code
复制代码

 

posted @   SmilePastaLi  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示