| | |
| | | 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; |
| | |
| | | /// <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); |
| | | } |
| | | |
| | |
| | | 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> |
| | |
| | | : 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> |
| | |
| | | var summary = await typeof(TEntity).GetSummary(xmlDoc); |
| | | var rep = Db.GetRepository<TEntity>(); |
| | | if (checkExist != null && await rep.AsQueryable().AsNoTracking().AnyAsync(checkExist)) |
| | | throw Oops.Oh(EnumErrorCodeType.s405, $"该{summary ?? "信息"}"); |
| | | throw Oops.Oh(EnumErrorCodeType.s405, $"{summary ?? "信息"}"); |
| | | if (request.Id.HasValue) |
| | | { |
| | | var q = rep.AsQueryable(); |
| | | if (query != null) q = query(q); |
| | | var entity = await q.FirstOrDefaultAsync(it => it.Id == request.Id, cancellationToken); |
| | | if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, $"该{summary ?? "信息"}"); |
| | | if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, $"{summary ?? "信息"}"); |
| | | if (update != null) update(entity); |
| | | else request.Adapt(entity); |
| | | await rep.UpdateAsync(entity); |