当前位置: 代码迷 >> 综合 >> 自动生成EF排序
  详细解决方案

自动生成EF排序

热度:88   发布时间:2023-10-14 21:48:05.0

为项目中使用所写,扩展实现根据实体自动生成排序,支持多字段排序。但必须与查询实体大小写匹配。

一,建立排序实体。

    /// <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里就是按上面三个字段和排序方式的结果。

  相关解决方案