优化分页排序和生成模板
continuous-integration/drone/push Build is passing Details

IRC_NewDev
hang 2024-08-17 20:33:21 +08:00
parent cd2166f11b
commit ff026f45fc
11 changed files with 300 additions and 186 deletions

View File

@ -168,6 +168,8 @@ builder.Services.AddSingleton<IUserIdProvider, IRaCISUserIdProvider>();
builder.Services.AddSingleton<ISearcher>(new Searcher(CachePolicy.Content, Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "ip2region.xdb"))); builder.Services.AddSingleton<ISearcher>(new Searcher(CachePolicy.Content, Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "ip2region.xdb")));
//builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
//builder.Services.AddProblemDetails();
#region 历史废弃配置 #region 历史废弃配置
//builder.Services.AddMemoryCache(); //builder.Services.AddMemoryCache();
@ -195,6 +197,8 @@ var env = app.Environment;
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
#region 异常处理 全局业务异常已统一处理了,非业务错误会来到这里 400 -500状态码 #region 异常处理 全局业务异常已统一处理了,非业务错误会来到这里 400 -500状态码
//app.UseStatusCodePagesWithReExecute("/Error/{0}"); //app.UseStatusCodePagesWithReExecute("/Error/{0}");
app.UseStatusCodePages(async context => app.UseStatusCodePages(async context =>
@ -213,28 +217,30 @@ app.UseStatusCodePages(async context =>
}); });
//app.UseExceptionHandler(o => { });
app.UseExceptionHandler(configure => //这里没生效原因未知官方文档也是这种写法也用了GlobalExceptionHandler 尝试还是不行怀疑框架bug
{ //app.UseExceptionHandler(configure =>
configure.Run(async context => //{
{ // configure.Run(async context =>
var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>(); // {
var ex = exceptionHandlerPathFeature?.Error; // var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();
context.Response.ContentType = "application/json"; //var ex = exceptionHandlerPathFeature?.Error;
//context.Response.ContentType = "application/json";
if (ex != null) //if (ex != null)
{ //{
var errorInfo = $"Exception: {ex.Message}[{ex.StackTrace}]" + (ex.InnerException != null ? $" InnerException: {ex.InnerException.Message}[{ex.InnerException.StackTrace}]" : ""); // var errorInfo = $"Exception: {ex.Message}[{ex.StackTrace}]" + (ex.InnerException != null ? $" InnerException: {ex.InnerException.Message}[{ex.InnerException.StackTrace}]" : "");
await context.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk($"{ex?.Message}"))); // await context.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk($"{ex?.Message}")));
Log.Logger.Error(errorInfo); // Log.Logger.Error(errorInfo);
} //}
}); // });
}); //});
@ -248,12 +254,11 @@ app.UseForwardedHeaders();
//响应压缩 //响应压缩
app.UseResponseCompression(); app.UseResponseCompression();
//app.UseCors(t => t.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
//不需要 token 访问的静态文件 wwwroot css, JavaScript, and images don't require authentication. //不需要 token 访问的静态文件 wwwroot css, JavaScript, and images don't require authentication.
app.UseStaticFiles(); app.UseStaticFiles();
app.UseMiddleware<MultiDiskStaticFilesMiddleware>();
//LogDashboard //LogDashboard
app.UseLogDashboard("/LogDashboard"); app.UseLogDashboard("/LogDashboard");
@ -262,6 +267,8 @@ app.UseLogDashboard("/LogDashboard");
app.UseHangfireConfig(env); app.UseHangfireConfig(env);
#region 暂时废弃 #region 暂时废弃
//app.UseMiddleware<MultiDiskStaticFilesMiddleware>();
////限流 中间件 ////限流 中间件
//app.UseIpRateLimiting(); //app.UseIpRateLimiting();
//if (env.IsDevelopment()) //if (env.IsDevelopment())

View File

@ -0,0 +1,50 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.BusinessFilter
{
/// <summary>
/// 不生效,不知道为啥
/// </summary>
public class GlobalExceptionHandler : IExceptionHandler
{
private readonly ILogger<GlobalExceptionHandler> _logger;
public GlobalExceptionHandler(ILogger<GlobalExceptionHandler> logger)
{
this._logger = logger;
}
public ValueTask<bool> TryHandleAsync(
HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken)
{
httpContext.Response.ContentType = "application/json";
var ex = exception;
var errorInfo = $"Exception: {ex.Message}[{ex.StackTrace}]" + (ex.InnerException != null ? $" InnerException: {ex.InnerException.Message}[{ex.InnerException.StackTrace}]" : "");
httpContext.Response.WriteAsJsonAsync(ResponseOutput.NotOk($"{ex?.Message}"));
_logger.LogError(errorInfo);
// return true to signal that this exception is handled
return ValueTask.FromResult(false);
}
}
}

View File

@ -29,31 +29,16 @@
签名 签名
</summary> </summary>
</member> </member>
<member name="T:IRaCIS.Core.Application.BusinessFilter.GlobalExceptionHandler">
<summary>
不生效,不知道为啥
</summary>
</member>
<member name="T:IRaCIS.Core.Application.Filter.TrialResourceFilter"> <member name="T:IRaCIS.Core.Application.Filter.TrialResourceFilter">
<summary> <summary>
主要为了 处理项目结束 锁库,不允许操作 主要为了 处理项目结束 锁库,不允许操作
</summary> </summary>
</member> </member>
<member name="M:IRaCIS.Core.Application.Helper.FileStoreHelper.GetSystemClinicalPathAsync(Microsoft.AspNetCore.Hosting.IWebHostEnvironment,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ClinicalDataSystemSet},System.Guid)">
<summary>
</summary>
<param name="_hostEnvironment"></param>
<param name="_clinicalDataTrialSetRepository"></param>
<param name="id"></param>
<returns></returns>
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
</member>
<member name="M:IRaCIS.Core.Application.Helper.FileStoreHelper.GetTrialClinicalPathAsync(Microsoft.AspNetCore.Hosting.IWebHostEnvironment,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ClinicalDataTrialSet},System.Guid)">
<summary>
</summary>
<param name="_hostEnvironment"></param>
<param name="_clinicalDataTrialSetRepository"></param>
<param name="id"></param>
<returns></returns>
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
</member>
<member name="M:IRaCIS.Core.Application.Helper.FileStoreHelper.WriteFileAsync(System.IO.Stream,System.String)"> <member name="M:IRaCIS.Core.Application.Helper.FileStoreHelper.WriteFileAsync(System.IO.Stream,System.String)">
<summary> <summary>
写文件导到磁盘 写文件导到磁盘
@ -62,28 +47,6 @@
<param name="path">文件保存路径</param> <param name="path">文件保存路径</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Helper.FileStoreHelper.GetUploadPrintscreenFilePath(Microsoft.AspNetCore.Hosting.IWebHostEnvironment,System.String,System.Guid,System.Guid,System.Guid)">
<summary>
上传截图
</summary>
<param name="_hostEnvironment"></param>
<param name="fileName"></param>
<param name="trialId"></param>
<param name="siteid"></param>
<param name="subjectId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Helper.FileStoreHelper.GetFilePath(Microsoft.AspNetCore.Hosting.IWebHostEnvironment,System.String,System.Guid,System.Guid,System.String)">
<summary>
通用获取文件路径
</summary>
<param name="_hostEnvironment"></param>
<param name="fileName"></param>
<param name="trialId"></param>
<param name="id"></param>
<param name="type"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Helper.OSSService.UploadToOSSAsync(System.IO.Stream,System.String,System.String,System.Boolean)"> <member name="M:IRaCIS.Core.Application.Helper.OSSService.UploadToOSSAsync(System.IO.Stream,System.String,System.String,System.Boolean)">
<summary> <summary>
oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder

View File

@ -41,7 +41,7 @@ namespace IRaCIS.Core.Application.Service
.WhereIf(string.IsNullOrEmpty(queryCommonDocument.Name), t => t.Name.Contains(queryCommonDocument.Name)) .WhereIf(string.IsNullOrEmpty(queryCommonDocument.Name), t => t.Name.Contains(queryCommonDocument.Name))
.ProjectTo<CommonDocumentView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, userId = _userInfo.Id }); .ProjectTo<CommonDocumentView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, userId = _userInfo.Id });
return await commonDocumentQueryable.ToPagedListAsync(queryCommonDocument.PageIndex, queryCommonDocument.PageSize, String.IsNullOrEmpty(queryCommonDocument.SortField) ? nameof(CommonDocument.Code) : queryCommonDocument.SortField, queryCommonDocument.Asc); ; return await commonDocumentQueryable.ToPagedListAsync(queryCommonDocument);
} }

View File

@ -25,7 +25,7 @@ namespace IRaCIS.Core.Application.Contracts
Task<List<TrialUserDto>> GetTrialUserSelect(Guid trialId); Task<List<TrialUserDto>> GetTrialUserSelect(Guid trialId);
PageOutput<DocumentUnionWithUserStatView> GetTrialSystemDocumentList(DocumentTrialUnionQuery querySystemDocument); Task<PageOutput<DocumentUnionWithUserStatView>> GetTrialSystemDocumentList(DocumentTrialUnionQuery querySystemDocument);
List<TrialUserUnionDocumentView> GetTrialUserDocumentList(Guid trialId); List<TrialUserUnionDocumentView> GetTrialUserDocumentList(Guid trialId);
} }
} }

View File

@ -64,7 +64,7 @@ namespace IRaCIS.Core.Application.Services
var trialDocumentQueryable = _trialDocumentRepository.AsQueryable(true).Where(t => t.TrialId == queryTrialDocument.TrialId) var trialDocumentQueryable = _trialDocumentRepository.AsQueryable(true).Where(t => t.TrialId == queryTrialDocument.TrialId)
.WhereIf(!string.IsNullOrEmpty(queryTrialDocument.Name), t => t.Name.Contains(queryTrialDocument.Name)) .WhereIf(!string.IsNullOrEmpty(queryTrialDocument.Name), t => t.Name.Contains(queryTrialDocument.Name))
.WhereIf(queryTrialDocument.FileTypeId != null, t => t.FileTypeId == queryTrialDocument.FileTypeId) .WhereIf(queryTrialDocument.FileTypeId != null, t => t.FileTypeId == queryTrialDocument.FileTypeId)
.WhereIf(queryTrialDocument.UserTypeId != null, t => t.NeedConfirmedUserTypeList.Any(t=>t.NeedConfirmUserTypeId== queryTrialDocument.UserTypeId) ) .WhereIf(queryTrialDocument.UserTypeId != null, t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == queryTrialDocument.UserTypeId))
.WhereIf(queryTrialDocument.IsDeleted != null, t => t.IsDeleted == queryTrialDocument.IsDeleted) .WhereIf(queryTrialDocument.IsDeleted != null, t => t.IsDeleted == queryTrialDocument.IsDeleted)
.ProjectTo<TrialDocumentView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, isEn_Us = _userInfo.IsEn_Us }); .ProjectTo<TrialDocumentView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, isEn_Us = _userInfo.IsEn_Us });
@ -75,17 +75,17 @@ namespace IRaCIS.Core.Application.Services
public async Task<PageOutput<TrialSignDocView>> GetTrialSignDocumentList(TrialDocQuery querySystemDocument) public async Task<PageOutput<TrialSignDocView>> GetTrialSignDocumentList(TrialDocQuery querySystemDocument)
{ {
var trialDocQueryable = from trialDoc in _trialDocumentRepository.AsQueryable(true) var trialDocQueryable = from trialDoc in _trialDocumentRepository.AsQueryable(true)
.WhereIf(querySystemDocument.TrialId!=null,t=>t.TrialId==querySystemDocument.TrialId) .WhereIf(querySystemDocument.TrialId != null, t => t.TrialId == querySystemDocument.TrialId)
.Where(t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) ) .Where(t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId))
join trialUser in _repository.Where<TrialUser>(t=>t.UserId==_userInfo.Id) on trialDoc.TrialId equals trialUser.TrialId join trialUser in _repository.Where<TrialUser>(t => t.UserId == _userInfo.Id) on trialDoc.TrialId equals trialUser.TrialId
join confirm in _repository.Where<TrialDocConfirmedUser>() on join confirm in _repository.Where<TrialDocConfirmedUser>() on
new { trialUser.UserId, TrialDocumentId = trialDoc.Id } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc new { trialUser.UserId, TrialDocumentId = trialDoc.Id } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc
from confirm in cc.DefaultIfEmpty() from confirm in cc.DefaultIfEmpty()
select new TrialSignDocView() select new TrialSignDocView()
{ {
TrialCode=trialDoc.Trial.TrialCode, TrialCode = trialDoc.Trial.TrialCode,
ResearchProgramNo = trialDoc.Trial.ResearchProgramNo, ResearchProgramNo = trialDoc.Trial.ResearchProgramNo,
ExperimentName = trialDoc.Trial.ExperimentName, ExperimentName = trialDoc.Trial.ExperimentName,
Id = trialDoc.Id, Id = trialDoc.Id,
@ -146,11 +146,11 @@ namespace IRaCIS.Core.Application.Services
{ {
result = await _systemDocumentService.getWaitSignSysDocList(new SystemDocumentQuery() result = await _systemDocumentService.getWaitSignSysDocList(new SystemDocumentQuery()
{ {
PageIndex=1, PageIndex = 1,
IsSigned = false, IsSigned = false,
PageSize=1, PageSize = 1,
Asc=false, Asc = false,
SortField="UpdateTime", SortField = "UpdateTime",
}); });
} }
@ -823,7 +823,7 @@ namespace IRaCIS.Core.Application.Services
/// <returns></returns> /// <returns></returns>
[HttpPost] [HttpPost]
[Obsolete] [Obsolete]
public PageOutput<DocumentUnionWithUserStatView> GetTrialSystemDocumentList(DocumentTrialUnionQuery querySystemDocument) public async Task<PageOutput<DocumentUnionWithUserStatView>> GetTrialSystemDocumentList(DocumentTrialUnionQuery querySystemDocument)
{ {
var systemDocumentQueryable = _repository var systemDocumentQueryable = _repository
.WhereIf<SystemDocument>(!_userInfo.IsAdmin, t => t.IsDeleted == false) .WhereIf<SystemDocument>(!_userInfo.IsAdmin, t => t.IsDeleted == false)
@ -867,7 +867,7 @@ namespace IRaCIS.Core.Application.Services
.WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name)) .WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name))
.WhereIf(querySystemDocument.FileTypeId != null, t => t.FileTypeId == querySystemDocument.FileTypeId); .WhereIf(querySystemDocument.FileTypeId != null, t => t.FileTypeId == querySystemDocument.FileTypeId);
return unionQuery.ToPagedList(querySystemDocument.PageIndex, querySystemDocument.PageSize, querySystemDocument.SortField, querySystemDocument.Asc); return await unionQuery.ToPagedListAsync(querySystemDocument.PageIndex, querySystemDocument.PageSize, querySystemDocument.SortField, querySystemDocument.Asc);
} }
#endregion #endregion

View File

@ -104,6 +104,8 @@ namespace IRaCIS.Core.Application.Contracts
.ThenBy(t=>t.ShowOrder) .ThenBy(t=>t.ShowOrder)
.ProjectTo<QCQuestionConfigureView>(_mapper.ConfigurationProvider); .ProjectTo<QCQuestionConfigureView>(_mapper.ConfigurationProvider);
var defalutSortArray = new string[] { nameof(QCQuestionConfigureView.LanguageType) + " desc", nameof(QCQuestionConfigureView.ShowOrder) };
return await QCQuestionQueryable.ToPagedListAsync(queryQCQuestionConfigure.PageIndex, queryQCQuestionConfigure.PageSize, new string[2] { "LanguageType desc", "ShowOrder asc" }); return await QCQuestionQueryable.ToPagedListAsync(queryQCQuestionConfigure.PageIndex, queryQCQuestionConfigure.PageSize, new string[2] { "LanguageType desc", "ShowOrder asc" });
} }

View File

@ -637,6 +637,7 @@ namespace IRaCIS.Core.Application.Service
ModuleName=x.ModuleName, ModuleName=x.ModuleName,
}); });
var defalutSortArray = new string[] { nameof(GetCRCConfirmListOutDto.SubjectCode) + " desc", nameof(GetCRCConfirmListOutDto.LatestScanDate) };
var result = await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, new string[2] { "SubjectCode asc", "LatestScanDate asc" }); var result = await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, new string[2] { "SubjectCode asc", "LatestScanDate asc" });

View File

@ -65,6 +65,8 @@ namespace IRaCIS.Core.Application.Service
.WhereIf(inDto.LanguageType != null, x => x.LanguageType == inDto.LanguageType!.Value) .WhereIf(inDto.LanguageType != null, x => x.LanguageType == inDto.LanguageType!.Value)
.ProjectTo<ReadingMedicineSystemQuestionView>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder); .ProjectTo<ReadingMedicineSystemQuestionView>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder);
var defalutSortArray = new string[] { nameof(ReadingMedicineSystemQuestionView.LanguageType) + " desc", nameof(ReadingMedicineSystemQuestionView.ShowOrder) };
return await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, new string[2] { "LanguageType desc", "ShowOrder asc" }); return await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, new string[2] { "LanguageType desc", "ShowOrder asc" });
} }

View File

@ -5,44 +5,86 @@ using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core; using System.Linq.Dynamic.Core;
using System.Collections.Generic; using System.Collections.Generic;
using System; using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
namespace IRaCIS.Core.Infrastructure.Extention namespace IRaCIS.Core.Infrastructure.Extention
{ {
public static class QueryablePageListExtensions public static class QueryablePageListExtensions
{ {
//单字段排序
public static PageOutput<T> ToPagedList<T>(this IQueryable<T> source, int pageIndex, int pageSize, string defaultSortFiled = "Id", bool isAsc = true) //单字段排序 异步 (或者默认排序字段是空,多字段排序,传递了,就以传递的单字段为准)
public static async Task<PageOutput<T>> ToPagedListAsync<T>(this IQueryable<T> source, PageInput pageInput, bool isMultiSortFiled = false, string[] sortArray = default, CancellationToken cancellationToken = default)
{ {
if (pageIndex <= 0)
if (isMultiSortFiled && sortArray == default)
{ {
pageIndex = 1; throw new InvalidOperationException("The sort field must be specified");
} }
if (pageSize <= 0)
if (pageInput.PageIndex <= 0)
{ {
pageSize = 10; pageInput.PageIndex = 1;
} }
var count = source.Count(); if (pageInput.PageSize <= 0)
{
pageInput.PageSize = 10;
}
var count = await source.CountAsync(cancellationToken).ConfigureAwait(false);
if (count == 0) if (count == 0)
{ {
return new PageOutput<T>() { CurrentPageData = new T[0] }; return new PageOutput<T>() { CurrentPageData = new T[0] };
} }
var propName=string.Empty;
var propName = string.IsNullOrWhiteSpace(defaultSortFiled) ? "Id" : defaultSortFiled; if (string.IsNullOrWhiteSpace(pageInput.SortField))
{
//没有指定优先以Id排序否则从属性里面随便取出来一个排序
var propertyNameList = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(t => t.CanWrite).Select(t => t.Name).OrderBy(t => t).ToList();
source = isAsc ? source.OrderBy(propName) : source.OrderBy(propName + " desc"); if (propertyNameList.Count == 0)
{
throw new InvalidOperationException("no default sort field.");
}
else
{
propName= propertyNameList.Contains("Id") ? "Id" : propertyNameList.FirstOrDefault();
}
source = source.Skip((pageIndex - 1) * pageSize); }
else
{
//有值,以前段传输的为主
propName = pageInput.SortField;
}
var items = source
.Take(pageSize) if (!isMultiSortFiled)
.ToArray(); {
source = pageInput.Asc ? source.OrderBy(propName) : source.OrderBy(propName + " desc");
}
else
{
var sortString = string.Join(',', sortArray);
source = source.OrderBy(sortString);
}
source = source.Skip((pageInput.PageIndex - 1) * pageInput.PageSize);
var items = await source
.Take(pageInput.PageSize)
.ToArrayAsync(cancellationToken)
.ConfigureAwait(false);
var pagedList = new PageOutput<T>() var pagedList = new PageOutput<T>()
{ {
PageIndex = pageIndex, PageIndex = pageInput.PageIndex,
PageSize = pageSize, PageSize = pageInput.PageSize,
TotalCount = count, TotalCount = count,
CurrentPageData = items CurrentPageData = items
}; };
@ -50,8 +92,10 @@ namespace IRaCIS.Core.Infrastructure.Extention
return pagedList; return pagedList;
} }
//单字段排序 异步 //单字段排序 异步
public static async Task<PageOutput<T>> ToPagedListAsync<T>(this IQueryable<T> source, int pageNumber, int pageSize, string defaultSortFiled = "Id", bool isAsc = true, bool isMultiSortFiled = false, string[] sortArray = default, CancellationToken cancellationToken = default) public static async Task<PageOutput<T>> ToPagedListAsync<T>(this IQueryable<T> source, int pageNumber, int pageSize, string defaultSortFiled = "Id", bool isAsc = true, bool isMultiSortFiled = false, string[] sortArray = default)
{ {
if (isMultiSortFiled && sortArray == default) if (isMultiSortFiled && sortArray == default)
@ -68,7 +112,7 @@ namespace IRaCIS.Core.Infrastructure.Extention
pageSize = 10; pageSize = 10;
} }
var count = await source.CountAsync(cancellationToken).ConfigureAwait(false); var count = await source.CountAsync().ConfigureAwait(false);
if (count == 0) if (count == 0)
{ {
@ -90,7 +134,7 @@ namespace IRaCIS.Core.Infrastructure.Extention
source = source.Skip((pageNumber - 1) * pageSize); source = source.Skip((pageNumber - 1) * pageSize);
var items = await source var items = await source
.Take(pageSize) .Take(pageSize)
.ToArrayAsync(cancellationToken) .ToArrayAsync()
.ConfigureAwait(false); .ConfigureAwait(false);
var pagedList = new PageOutput<T>() var pagedList = new PageOutput<T>()
@ -105,85 +149,11 @@ namespace IRaCIS.Core.Infrastructure.Extention
} }
public static PageOutput<T> ToPagedList<T>(this IList<T> source, int pageIndex, int pageSize, string defaultSortFiled = "Id", bool isAsc = true)
{
if (pageIndex <= 0)
{
pageIndex = 1;
}
if (pageSize <= 0)
{
pageSize = 10;
}
var count = source.Count();
if (count == 0)
{
return new PageOutput<T>() { CurrentPageData = new List<T>() };
}
var propName = string.IsNullOrWhiteSpace(defaultSortFiled) ? "Id" : defaultSortFiled;
IQueryable<T> sourceQuery = isAsc ? source.AsQueryable().OrderBy(propName) : source.AsQueryable().OrderBy(propName + " desc");
sourceQuery = sourceQuery.Skip((pageIndex - 1) * pageSize);
var items = sourceQuery
.Take(pageSize)
.ToArray();
var pagedList = new PageOutput<T>()
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = count,
CurrentPageData = items
};
return pagedList;
}
//多字段排序 ["a asc", "b desc", "c asc"]
public static PageOutput<T> ToPagedList<T>(this IQueryable<T> source, int pageIndex, int pageSize, string[] sortArray)
{
if (pageIndex <= 0)
{
pageIndex = 1;
}
if (pageSize <= 0)
{
pageSize = 10;
}
var count = source.Count();
if (count == 0)
{
return new PageOutput<T>() { CurrentPageData = new T[0] };
}
var sortString = string.Join(',', sortArray);
source.OrderBy(sortString);
source = source.Skip((pageIndex - 1) * pageSize);
var items = source
.Take(pageSize)
.ToArray();
var pagedList = new PageOutput<T>()
{
PageIndex = pageIndex,
PageSize = pageSize,
TotalCount = count,
CurrentPageData = items
};
return pagedList;
}
//多字段排序异步 ["a asc", "b desc", "c asc"] //多字段排序异步 ["a asc", "b desc", "c asc"]
public static async Task<PageOutput<T>> ToPagedListAsync<T>(this IQueryable<T> source, int pageNumber, int pageSize, string[] sortArray, CancellationToken cancellationToken = default) public static async Task<PageOutput<T>> ToPagedListAsync<T>(this IQueryable<T> source, int pageNumber, int pageSize, string[] sortArray)
{ {
if (pageNumber <= 0) if (pageNumber <= 0)
{ {
@ -194,7 +164,7 @@ namespace IRaCIS.Core.Infrastructure.Extention
pageSize = 10; pageSize = 10;
} }
var count = await source.CountAsync(cancellationToken).ConfigureAwait(false); var count = await source.CountAsync().ConfigureAwait(false);
if (count == 0) if (count == 0)
{ {
@ -212,7 +182,7 @@ namespace IRaCIS.Core.Infrastructure.Extention
source = source.Skip((pageNumber - 1) * pageSize); source = source.Skip((pageNumber - 1) * pageSize);
var items = await source var items = await source
.Take(pageSize) .Take(pageSize)
.ToArrayAsync(cancellationToken) .ToArrayAsync()
.ConfigureAwait(false); .ConfigureAwait(false);
var pagedList = new PageOutput<T>() var pagedList = new PageOutput<T>()
@ -227,6 +197,127 @@ namespace IRaCIS.Core.Infrastructure.Extention
} }
#region 同步方法废弃
////单字段排序
//public static PageOutput<T> ToPagedList<T>(this IQueryable<T> source, int pageIndex, int pageSize, string defaultSortFiled = "Id", bool isAsc = true)
//{
// if (pageIndex <= 0)
// {
// pageIndex = 1;
// }
// if (pageSize <= 0)
// {
// pageSize = 10;
// }
// var count = source.Count();
// if (count == 0)
// {
// return new PageOutput<T>() { CurrentPageData = new T[0] };
// }
// var propName = string.IsNullOrWhiteSpace(defaultSortFiled) ? "Id" : defaultSortFiled;
// source = isAsc ? source.OrderBy(propName) : source.OrderBy(propName + " desc");
// source = source.Skip((pageIndex - 1) * pageSize);
// var items = source
// .Take(pageSize)
// .ToArray();
// var pagedList = new PageOutput<T>()
// {
// PageIndex = pageIndex,
// PageSize = pageSize,
// TotalCount = count,
// CurrentPageData = items
// };
// return pagedList;
//}
//public static PageOutput<T> ToPagedList<T>(this IList<T> source, int pageIndex, int pageSize, string defaultSortFiled = "Id", bool isAsc = true)
//{
// if (pageIndex <= 0)
// {
// pageIndex = 1;
// }
// if (pageSize <= 0)
// {
// pageSize = 10;
// }
// var count = source.Count();
// if (count == 0)
// {
// return new PageOutput<T>() { CurrentPageData = new List<T>() };
// }
// var propName = string.IsNullOrWhiteSpace(defaultSortFiled) ? "Id" : defaultSortFiled;
// IQueryable<T> sourceQuery = isAsc ? source.AsQueryable().OrderBy(propName) : source.AsQueryable().OrderBy(propName + " desc");
// sourceQuery = sourceQuery.Skip((pageIndex - 1) * pageSize);
// var items = sourceQuery
// .Take(pageSize)
// .ToArray();
// var pagedList = new PageOutput<T>()
// {
// PageIndex = pageIndex,
// PageSize = pageSize,
// TotalCount = count,
// CurrentPageData = items
// };
// return pagedList;
//}
////多字段排序 ["a asc", "b desc", "c asc"]
//public static PageOutput<T> ToPagedList<T>(this IQueryable<T> source, int pageIndex, int pageSize, string[] sortArray)
//{
// if (pageIndex <= 0)
// {
// pageIndex = 1;
// }
// if (pageSize <= 0)
// {
// pageSize = 10;
// }
// var count = source.Count();
// if (count == 0)
// {
// return new PageOutput<T>() { CurrentPageData = new T[0] };
// }
// var sortString = string.Join(',', sortArray);
// source.OrderBy(sortString);
// source = source.Skip((pageIndex - 1) * pageSize);
// var items = source
// .Take(pageSize)
// .ToArray();
// var pagedList = new PageOutput<T>()
// {
// PageIndex = pageIndex,
// PageSize = pageSize,
// TotalCount = count,
// CurrentPageData = items
// };
// return pagedList;
//}
#endregion
} }
} }

View File

@ -74,9 +74,7 @@ namespace IRaCIS.Core.Application.Service
_<#=char.ToLower(tableName[0]) + tableName.Substring(1)#>Repository _<#=char.ToLower(tableName[0]) + tableName.Substring(1)#>Repository
.ProjectTo<<#=tableName#>View>(_mapper.ConfigurationProvider); .ProjectTo<<#=tableName#>View>(_mapper.ConfigurationProvider);
var pageList= await <#=char.ToLower(tableName[0]) + tableName.Substring(1)#>Queryable var pageList= await <#=char.ToLower(tableName[0]) + tableName.Substring(1)#>Queryable.ToPagedListAsync(<#=tableName#>Query);
.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(<#=tableName#>View.Id) : inQuery.SortField,
inQuery.Asc);
return pageList; return pageList;
} }