From bc6813b74e9a390eae2181d460c647445b7cb25a Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期三, 06 八月 2025 11:22:18 +0800 Subject: [PATCH] feat:数据字典开发 --- FlexJobApi.Core/Utils/DbUtils/DbUtils.cs | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 118 insertions(+), 0 deletions(-) diff --git a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs index ecaf344..e6a1389 100644 --- a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs +++ b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs @@ -25,6 +25,124 @@ public static class DbUtils { /// <summary> + /// 鏌ヨ鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + /// <typeparam name="TEntity"></typeparam> + /// <typeparam name="TItem"></typeparam> + /// <param name="page"></param> + /// <param name="query"></param> + /// <param name="selector"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public static async Task<PagedListQueryResult<TItem>> ToPagedListAsync<TEntity, TItem>( + this PagedListQueryPageModel page, + Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null, + Expression<Func<TEntity, TItem>> selector = null, + CancellationToken cancellationToken = default) + where TEntity : CommonEntity, new() + where TItem : class, new() + { + var rep = Db.GetRepository<TEntity>(); + var q = rep.AsQueryable().AsNoTracking(); + if (query != null) q = query(q); + q = q.OrderBy(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="T"></typeparam> + /// <param name="q"></param> + /// <param name="orders"></param> + /// <returns></returns> + public static IQueryable<T> OrderBy<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) + { + 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++; + } + + return q; + } + + /// <summary> + /// 璁剧疆鏄惁绂佺敤 + /// </summary> + /// <typeparam name="TEntity"></typeparam> + /// <param name="request"></param> + /// <param name="query"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public static async Task<int> SetIsDisable<TEntity>(this SetIsDisabledCommand request, Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null, CancellationToken cancellationToken = default) + where TEntity : CommonEntity, IIsDisabled, new() + { + var rep = Db.GetRepository<TEntity>(); + var q = rep.AsQueryable(); + if (query != null) q = query(q); + var entities = await q + .Where(it => request.Ids.Contains(it.Id) && it.IsDisabled != request.IsDisabled) + .ToListAsync(); + foreach (var entity in entities) + { + entity.IsDisabled = request.IsDisabled; + } + return entities.Count; + } + + /// <summary> /// 鍒犻櫎鏁版嵁 /// </summary> /// <typeparam name="TEntity"></typeparam> -- Gitblit v1.9.1