为项目中使用所写,扩展实现根据实体自动生成排序,支持多字段排序。但必须与查询实体大小写匹配。
一,建立排序实体。
/// <summary>/// 排序条件模型/// </summary>public class OrderItemModel{public string FieldName { get; set; }public string SortType { get; set; }}
二,扩展orderby。
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, List<OrderItemModel> oims){if (source == null) throw new ArgumentNullException("source");var bNull = oims.TrueForAll(s =>{if (s.FieldName.IsEmpty() && s.SortType.IsEmpty())return false;elsereturn true;});if (!bNull) return source;string propertyName = string.Empty, sortDirection = string.Empty;var sorts = oims.ToArray();for (int i = 0; i < sorts.Length; i++){var sortExpression = sorts[i];propertyName = sortExpression.FieldName.Trim();sortDirection = sortExpression.SortType.Trim();ParameterExpression parameter = Expression.Parameter(source.ElementType, string.Empty);MemberExpression property = Expression.Property(parameter, propertyName);LambdaExpression lambda = Expression.Lambda(property, parameter);string methodName = string.Empty;if (i == 0){methodName = (sortDirection.ToUpper() == "ASC") ? "OrderBy" : "OrderByDescending";}else{methodName = (sortDirection.ToUpper() == "ASC") ? "ThenBy" : "ThenByDescending";}Expression methodCallExpression = Expression.Call(typeof(Queryable), methodName,new Type[] { source.ElementType, property.Type },source.Expression, Expression.Quote(lambda));source = source.Provider.CreateQuery<T>(methodCallExpression);}return source;}
三,使用方法。在使用排序表达式的位置传入。
List<OrderItemModel> oims = new List<OrderItemModel> {new OrderItemModel{ FieldName="id", SortType="desc" },new OrderItemModel{ FieldName="sort", SortType="asc" },new OrderItemModel{ FieldName="hideInMenu", SortType="desc" },};var result = getAsync(oims);
result里就是按上面三个字段和排序方式的结果。