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; }
使用动态排序:
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();

浙公网安备 33010602011771号