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 @ 2024-04-12 15:42  SmilePastaLi  阅读(93)  评论(0)    收藏  举报