From 85279c0daafcfea80db14cdd8dfe85f7c7fddba4 Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期五, 08 八月 2025 13:40:09 +0800 Subject: [PATCH] fix:bug --- FlexJobApi.Core/Utils/DbUtils/DbUtils.cs | 99 +++++++++++++++++++++---------------------------- FlexJobApi.Core/FlexJobApi.Core.xml | 9 ---- FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs | 1 3 files changed, 42 insertions(+), 67 deletions(-) diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml index e7c1016..dec6d96 100644 --- a/FlexJobApi.Core/FlexJobApi.Core.xml +++ b/FlexJobApi.Core/FlexJobApi.Core.xml @@ -5193,15 +5193,6 @@ <param name="cancellationToken"></param> <returns></returns> </member> - <member name="M:FlexJobApi.Core.DbUtils.CustomOrderBy``1(System.Linq.IQueryable{``0},System.Collections.Generic.List{FlexJobApi.Core.PagedListQueryPageModelOrderInput})"> - <summary> - 鎺掑簭 - </summary> - <typeparam name="T"></typeparam> - <param name="q"></param> - <param name="orders"></param> - <returns></returns> - </member> <member name="M:FlexJobApi.Core.DbUtils.SetIsDisabled``1(FlexJobApi.Core.SetIsDisabledCommand,System.Func{System.Linq.IQueryable{``0},System.Linq.IQueryable{``0}},System.Threading.CancellationToken)"> <summary> 璁剧疆鏄惁绂佺敤 diff --git a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs index b770ec5..55647c2 100644 --- a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs +++ b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs @@ -175,7 +175,7 @@ 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>(); @@ -185,66 +185,51 @@ 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> diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs index 119cc75..ce5cbb0 100644 --- a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs +++ b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs @@ -87,7 +87,6 @@ { q = q.Where(it => it.RecommendStatus == request.RecommendStatus); } - q = q.CustomOrderBy(request.PageModel.OrderInput); var s = from t in q join tu in rep.Change<TaskInfoUser>().AsQueryable().AsNoTracking() on t.Id equals tu.TaskInfoId into tug select new GetTaskInfosQueryResultItem -- Gitblit v1.9.1