1、ABP已经定义好了分页请求DTO,返回数据格式的DTO,分别如下图:
结构
以上DTO免费版的没有,收费版里面有,但是我们可以模仿定义,从中可以看到主要包括以下四个公共DTO定义:
PagedInputDto:分页请求Dto
PagedAndSortedInputDto:分页排序Dto
PagedSortedAndFilteredInputDto:分页排序过滤Dto
PagedAndFilteredInputDto:分页过滤Dto
其中主要定义了以下几个主要属性:
MaxResultCount:每页行数
SkipCount:跳转数量,一般计算公式为SkipCount=(Page-1)*MaxResultCount(页数*行数)。
Filter:过滤字符串
Sorting:排序方式
其实我们只要继承AsyncCrudAppService这个类就已经实现了分页功能,方法是GetALL()
继承
比如我继承了AsyncCrudAppService,这个类是异步的方法,这个类的实现:
public abstract class AsyncCrudAppService : CrudAppServiceBase, IAsyncCrudAppService, IApplicationService, ITransientDependency
where TEntity : class, IEntity
where TEntityDto : IEntityDto
where TUpdateInput : IEntityDto
where TGetInput : IEntityDto
where TDeleteInput : IEntityDto
{
protected AsyncCrudAppService(IRepository repository);
public IAsyncQueryableExecuter AsyncQueryableExecuter { get; set; }
[AsyncStateMachine(typeof(AsyncCrudAppService.d__7))]
public virtual Task Create(TCreateInput input);
public virtual Task Delete(TDeleteInput input);
[AsyncStateMachine(typeof(AsyncCrudAppService.d__5))]
public virtual Task Get(TGetInput input);
[AsyncStateMachine(typeof(AsyncCrudAppService.d__6))]
public virtual Task
> GetAll(TGetAllInput input);
[AsyncStateMachine(typeof(AsyncCrudAppService.d__8))]
public virtual Task Update(TUpdateInput input);
protected virtual Task GetEntityByIdAsync(TPrimaryKey id);
}
主要看 public virtual Task
> GetAll(TGetAllInput input);这个方法,我传入的PagedResultRequestDto,返回的是PageresultDto,PagedResultRequestDto这个类里有两个属性SkipCount,MaxResultCount 这两个属性,返回类型
namespace Abp.Application.Services.Dto
{
//
// 摘要:
// Implements Abp.Application.Services.Dto.IPagedResult`1.
//
// 类型参数:
// T:
// Type of the items in the Abp.Application.Services.Dto.ListResultDto`1.Items list
public class PagedResultDto : ListResultDto, IPagedResult, IListResult, IHasTotalCount
{
//
// 摘要:
// Creates a new Abp.Application.Services.Dto.PagedResultDto`1 object.
public PagedResultDto();
//
// 摘要:
// Creates a new Abp.Application.Services.Dto.PagedResultDto`1 object.
//
// 参数:
// totalCount:
// Total count of Items
//
// items:
// List of items in current page
public PagedResultDto(int totalCount, IReadOnlyList items);
//
// 摘要:
// Total count of Items.
public int TotalCount { get; set; }
}
}
他包含了totalcount和items两个属性,你们可以自己查看。
以上是自动创建的分页的,我没有实现任何代码,现在我们的查询要增加过滤,我需要改造以上代码,首先改造DTO,免费版的是没有以上DTO,自己手写,默认有这个dto =>PagedResultRequestDto
添加DTO
我们来写一个前端查询所有用户的方法,
public async Task
> GetUserList(PagedSortedAndFilteredInputDto requestDTO)
{
var query = _userRepository.GetAll().WhereIf(!string.IsNullOrEmpty(requestDTO.Filter), m => m.UserName.Contains(requestDTO.Filter));
query = !string.IsNullOrEmpty(requestDTO.Sorting) ? query.OrderBy(m=>requestDTO.Sorting) : query.OrderByDescending(m => m.CreationTime);
var taskcount = query.Count();
var tasklist = query.PageBy(requestDTO).ToList();
return new PagedResultDto(taskcount, tasklist.MapTo
>());
}
这个代码里面用到了whereIF和pageby,这两个方法是ABP定义的扩展方法,Mapto也是ABP定义的扩展方法,前端请求就能获取到数据了
领取专属 10元无门槛券
私享最新 技术干货