sunpengfei
2025-08-11 3d1063a22442b8254f18cbf74854ee07301ba2ca
FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
@@ -148,12 +148,39 @@
            var q = rep.AsQueryable().AsNoTracking();
            if (query != null) q = query(q);
            else q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime);
            q = q.CustomOrderBy(page.OrderInput);
            if (page.OrderInput.IsNotNull())
                q = q.CustomOrderBy(page.OrderInput);
            var s = selector == null
                ? q.ProjectToType<TItem>()
                : q.Select(selector);
            var pagedList = await s.ToPagedListAsync(page.Page, page.Rows, cancellationToken);
            var result = new PagedListQueryResult<TItem>();
            result.PageModel = page.Adapt<PagedListQueryResultPageModel>();
            result.PageModel.TotalCount = pagedList.TotalCount;
            result.PageModel.TotalPage = pagedList.TotalPages;
            result.Data = pagedList.Items.ToList();
            return result;
        }
        /// <summary>
        /// 查询分页列表数据
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <typeparam name="TItem"></typeparam>
        /// <param name="page"></param>
        /// <param name="q"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static async Task<TResult> GetPagedListAsync<TResult, TItem>(
            this PagedListQueryPageModel page,
            IQueryable<TItem> q,
            CancellationToken cancellationToken = default)
            where TItem : class, new()
            where TResult : PagedListQueryResult<TItem>, new()
        {
            if (page.OrderInput.IsNotNull())
                q = q.CustomOrderBy(page.OrderInput);
            var pagedList = await q.ToPagedListAsync(page.Page, page.Rows, cancellationToken);
            var result = new TResult();
            result.PageModel = page.Adapt<PagedListQueryResultPageModel>();
            result.PageModel.TotalCount = pagedList.TotalCount;
            result.PageModel.TotalPage = pagedList.TotalPages;
@@ -169,34 +196,27 @@
        /// <param name="q"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static async Task<PagedListQueryResult<TItem>> GetPagedListAsync<TItem>(
        public static Task<PagedListQueryResult<TItem>> GetPagedListAsync<TItem>(
            this PagedListQueryPageModel page,
            IQueryable<TItem> q,
            CancellationToken cancellationToken = default)
            where TItem : class, new()
        {
            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>();
            result.PageModel.TotalCount = pagedList.TotalCount;
            result.PageModel.TotalPage = pagedList.TotalPages;
            result.Data = pagedList.Items.ToList();
            return result;
            return GetPagedListAsync<PagedListQueryResult<TItem>, TItem>(page, q, cancellationToken);
        }
        public static IOrderedQueryable<T> CustomOrderBy<T>(this IQueryable<T> q, List<PagedListQueryPageModelOrderInput> orders)
        {
            ParameterExpression parameter = Expression.Parameter(typeof(T), "p");
            PagedListQueryPageModelOrderInput orderInput = orders[0];
            IOrderedQueryable<T> orderedQueryable = (orderInput.Order == EnumPagedListOrder.Asc)
                ? OrderBy(q, orderInput.Property, parameter)
            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++)
            {
                PagedListQueryPageModelOrderInput orderInput2 = orders[i];
                orderedQueryable = (orderInput2.Order == EnumPagedListOrder.Asc)
                    ? ThenBy(orderedQueryable, orderInput2.Property, parameter)
                orderedQueryable = (orderInput2.Order == EnumPagedListOrder.Asc)
                    ? ThenBy(orderedQueryable, orderInput2.Property, parameter)
                    : ThenByDescending(orderedQueryable, orderInput2.Property, parameter);
            }
@@ -230,6 +250,32 @@
        public static IOrderedQueryable<T> ThenByDescending<T>(IOrderedQueryable<T> source, string propertyName, ParameterExpression parameter)
        {
            return Ordering(source, parameter, propertyName, "ThenByDescending");
        }
        public static async Task<TResult> GetDetail<TEntity, TResult>(
            this Guid id,
            CancellationToken cancellationToken = default)
            where TEntity : CommonEntity, new()
        {
            var rep = Db.GetRepository<TEntity>();
            return await rep.AsQueryable().AsNoTracking()
                .Where(it => it.Id == id)
                .GetDetail<TEntity, TResult>(cancellationToken);
        }
        public static async Task<TResult> GetDetail<TEntity, TResult>(
            this IQueryable<TEntity> q,
            CancellationToken cancellationToken = default)
        {
            var model = await q
                .ProjectToType<TResult>()
                .FirstOrDefaultAsync(cancellationToken);
            if (model == null)
            {
                var summary = await typeof(TEntity).GetSummary();
                throw Oops.Oh(EnumErrorCodeType.s404, $"该{summary ?? "信息"}");
            }
            return model;
        }
        /// <summary>
@@ -284,6 +330,27 @@
                : 0;
        }
        public static async Task<Guid> UpdateData<TEntity, TRequest>(
            this IQueryable<TEntity> q,
            TRequest request,
            Action<TEntity> update = null,
            CancellationToken cancellationToken = default)
            where TEntity : CommonEntity, new()
        {
            var rep = Db.GetRepository<TEntity>();
            var entity = await q.FirstOrDefaultAsync();
            if (entity == null)
            {
                var summary = await typeof(TEntity).GetSummary();
                throw Oops.Oh(EnumErrorCodeType.s404, $"该{summary ?? "信息"}");
            }
            if (update != null) update(entity);
            else request.Adapt(entity);
            await rep.UpdateAsync(entity);
            return entity.Id;
        }
        /// <summary>
        /// 保存数据
        /// </summary>