From 53ee0a68605433db362abae3ed1af03fd23a7832 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 08 八月 2025 15:57:33 +0800
Subject: [PATCH] pref:优化

---
 FlexJobApi.Core/Utils/DbUtils/DbUtils.cs |   99 +++++++++++++++++++++----------------------------
 1 files changed, 42 insertions(+), 57 deletions(-)

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>

--
Gitblit v1.9.1