经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
使用.NET 6开发TodoList应用(16)——实现查询排序
来源:cnblogs  作者:CODE4NOTHING  时间:2022/1/3 23:27:03  对本文有异议

系列导航及源代码

需求

关于查询的另一个需求是要根据前端请求的排序字段进行对结果相应的排序。

目标

实现根据排序要求返回排序后的结果

原理与思路

要实现根据前端请求的进行相应排序,结合我们之前写好的Specification,可以比较简单地做到。

实现

我们还是用TodoItem请求来举例,再添加一个排序字段到查询请求中:

  • GetTodoItemsWithConditionQuery.cs
  1. using AutoMapper;
  2. using AutoMapper.QueryableExtensions;
  3. using MediatR;
  4. using TodoList.Application.Common.Interfaces;
  5. using TodoList.Application.Common.Mappings;
  6. using TodoList.Application.Common.Models;
  7. using TodoList.Application.TodoItems.Specs;
  8. using TodoList.Domain.Entities;
  9. using TodoList.Domain.Enums;
  10. namespace TodoList.Application.TodoItems.Queries.GetTodoItems;
  11. public class GetTodoItemsWithConditionQuery : IRequest<PaginatedList<TodoItemDto>>
  12. {
  13. public Guid ListId { get; set; }
  14. public bool? Done { get; set; }
  15. public string? Title { get; set; }
  16. public PriorityLevel? PriorityLevel { get; set; }
  17. public string? SortOrder { get; set; } = "title_asc";
  18. public int PageNumber { get; set; } = 1;
  19. public int PageSize { get; set; } = 10;
  20. }
  21. public class GetTodoItemsWithConditionQueryHandler : IRequestHandler<GetTodoItemsWithConditionQuery, PaginatedList<TodoItemDto>>
  22. {
  23. private readonly IRepository<TodoItem> _repository;
  24. private readonly IMapper _mapper;
  25. public GetTodoItemsWithConditionQueryHandler(IRepository<TodoItem> repository, IMapper mapper)
  26. {
  27. _repository = repository;
  28. _mapper = mapper;
  29. }
  30. public async Task<PaginatedList<TodoItemDto>> Handle(GetTodoItemsWithConditionQuery request, CancellationToken cancellationToken)
  31. {
  32. var spec = new TodoItemSpec(request);
  33. return await _repository
  34. .GetAsQueryable(spec)
  35. .ProjectTo<TodoItemDto>(_mapper.ConfigurationProvider)
  36. .PaginatedListAsync(request.PageNumber, request.PageSize);
  37. }
  38. }

同时把原本写在查询中的条件整合到了TodoItemSpec中:

  • TodoItemSpec.cs
  1. // 省略其他...
  2. public TodoItemSpec(GetTodoItemsWithConditionQuery query) :
  3. base(x => x.ListId == query.ListId
  4. && (!query.Done.HasValue || x.Done == query.Done)
  5. && (!query.PriorityLevel.HasValue || x.Priority == query.PriorityLevel)
  6. && (string.IsNullOrEmpty(query.Title) || x.Title!.Trim().ToLower().Contains(query.Title!.ToLower())))
  7. {
  8. if (string.IsNullOrEmpty(query.SortOrder))
  9. return;
  10. switch (query.SortOrder)
  11. {
  12. // 仅作有限的演示
  13. default:
  14. ApplyOrderBy(x => x.Title!);
  15. break;
  16. case "title_desc":
  17. ApplyOrderByDescending(x =>x .Title!);
  18. break;
  19. case "priority_asc":
  20. ApplyOrderBy(x => x.Priority);
  21. break;
  22. case "priority_desc":
  23. ApplyOrderByDescending(x => x.Priority);
  24. break;
  25. }
  26. }

验证

启动Api项目,执行查询TodoItem的请求:

  • 请求
    image

  • 响应
    image

总结

这样我们就完成了根据前端需求进行后端排序并返回结果的需求,下一篇文章我们将介绍查询中的最后一个不是很常用,但是在某些情况下很有用的概念:数据塑形。

原文链接:http://www.cnblogs.com/code4nothing/p/build-todolist-16.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号