| | |
| | | CancellationToken cancellationToken = default) |
| | | where TItem : class, new() |
| | | { |
| | | //q = q.CustomOrderBy(page.OrderInput); |
| | | q = q.CustomOrderBy(page.OrderInput); |
| | | var pagedList = await q.ToPagedListAsync(page.Page, page.Rows, cancellationToken); |
| | | var result = new PagedListQueryResult<TItem>(); |
| | | result.PageModel = page.Adapt<PagedListQueryResultPageModel>(); |
| | |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 排序 |
| | | /// </summary> |
| | | /// <typeparam name="T"></typeparam> |
| | | /// <param name="q"></param> |
| | | /// <param name="orders"></param> |
| | | /// <returns></returns> |
| | | public static IQueryable<T> CustomOrderBy<T>( |
| | | this IQueryable<T> q, |
| | | List<PagedListQueryPageModelOrderInput> orders) |
| | | public static IOrderedQueryable<T> CustomOrderBy<T>(this IQueryable<T> q, List<PagedListQueryPageModelOrderInput> orders) |
| | | { |
| | | if (orders.IsNull()) return q; |
| | | |
| | | var entityType = typeof(T); |
| | | int index = 0; |
| | | |
| | | var props = entityType.GetProperties(); |
| | | foreach (var order in orders) |
| | | ParameterExpression parameter = Expression.Parameter(typeof(T), "p"); |
| | | PagedListQueryPageModelOrderInput orderInput = orders[0]; |
| | | IOrderedQueryable<T> orderedQueryable = (orderInput.Order == EnumPagedListOrder.Asc) |
| | | ? OrderBy(q, orderInput.Property, parameter) |
| | | : OrderByDescending(q, orderInput.Property, parameter); |
| | | for (int i = 1; i < orders.Count; i++) |
| | | { |
| | | if (string.IsNullOrEmpty(order.Property)) continue; |
| | | |
| | | // 获取排序字段的属性信息 |
| | | var propertyInfo = props.FirstOrDefault(it => it.Name.Equals(order.Property, StringComparison.OrdinalIgnoreCase)); |
| | | if (propertyInfo == null) throw Oops.Oh(EnumErrorCodeType.s404, $"该排序字段{order.Property}"); |
| | | |
| | | // 创建表达式树 |
| | | var parameter = Expression.Parameter(entityType, "x"); |
| | | var propertyAccess = Expression.Property(parameter, propertyInfo); |
| | | var lambda = Expression.Lambda(propertyAccess, parameter); |
| | | |
| | | string methodName; |
| | | if (index == 0) |
| | | { |
| | | // 首次排序 |
| | | methodName = order.Order == EnumPagedListOrder.Asc |
| | | ? "OrderBy" |
| | | : "OrderByDescending"; |
| | | } |
| | | else |
| | | { |
| | | // 二次及以后排序 |
| | | methodName = order.Order == EnumPagedListOrder.Asc |
| | | ? "ThenBy" |
| | | : "ThenByDescending"; |
| | | } |
| | | |
| | | // 调用相应的排序方法 |
| | | var resultExpression = Expression.Call( |
| | | typeof(Queryable), |
| | | methodName, |
| | | [entityType, propertyInfo.PropertyType], |
| | | q.Expression, |
| | | Expression.Quote(lambda) |
| | | ); |
| | | |
| | | q = q.Provider.CreateQuery<T>(resultExpression); |
| | | index++; |
| | | PagedListQueryPageModelOrderInput orderInput2 = orders[i]; |
| | | orderedQueryable = (orderInput2.Order == EnumPagedListOrder.Asc) |
| | | ? ThenBy(orderedQueryable, orderInput2.Property, parameter) |
| | | : ThenByDescending(orderedQueryable, orderInput2.Property, parameter); |
| | | } |
| | | |
| | | return q; |
| | | return orderedQueryable; |
| | | } |
| | | |
| | | private static IOrderedQueryable<T> Ordering<T>(IQueryable<T> source, ParameterExpression parameter, string propertyName, string methodName) |
| | | { |
| | | Type typeFromHandle = typeof(T); |
| | | MemberExpression memberExpression = Expression.PropertyOrField(parameter, propertyName); |
| | | LambdaExpression expression = Expression.Lambda(memberExpression, parameter); |
| | | MethodCallExpression expression2 = Expression.Call(typeof(Queryable), methodName, [typeFromHandle, memberExpression.Type], source.Expression, Expression.Quote(expression)); |
| | | return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(expression2); |
| | | } |
| | | |
| | | public static IOrderedQueryable<T> OrderBy<T>(IQueryable<T> source, string propertyName, ParameterExpression parameter) |
| | | { |
| | | return Ordering(source, parameter, propertyName, "OrderBy"); |
| | | } |
| | | |
| | | public static IOrderedQueryable<T> OrderByDescending<T>(IQueryable<T> source, string propertyName, ParameterExpression parameter) |
| | | { |
| | | return Ordering(source, parameter, propertyName, "OrderByDescending"); |
| | | } |
| | | |
| | | public static IOrderedQueryable<T> ThenBy<T>(IOrderedQueryable<T> source, string propertyName, ParameterExpression parameter) |
| | | { |
| | | return Ordering(source, parameter, propertyName, "ThenBy"); |
| | | } |
| | | |
| | | public static IOrderedQueryable<T> ThenByDescending<T>(IOrderedQueryable<T> source, string propertyName, ParameterExpression parameter) |
| | | { |
| | | return Ordering(source, parameter, propertyName, "ThenByDescending"); |
| | | } |
| | | |
| | | /// <summary> |