使用.NET 6开发TodoList应用(16)——实现查询排序


系列导航及源代码

需求

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

目标

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

原理与思路

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

实现

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

  • GetTodoItemsWithConditionQuery.cs
using AutoMapper;
using AutoMapper.QueryableExtensions;
using MediatR;
using TodoList.Application.Common.Interfaces;
using TodoList.Application.Common.Mappings;
using TodoList.Application.Common.Models;
using TodoList.Application.TodoItems.Specs;
using TodoList.Domain.Entities;
using TodoList.Domain.Enums;

namespace TodoList.Application.TodoItems.Queries.GetTodoItems;

public class GetTodoItemsWithConditionQuery : IRequest<PaginatedList<TodoItemDto>>
{
    public Guid ListId { get; set; }
    public bool? Done { get; set; }
    public string? Title { get; set; }
    public PriorityLevel? PriorityLevel { get; set; }
    public string? SortOrder { get; set; } = "title_asc";
    public int PageNumber { get; set; } = 1;
    public int PageSize { get; set; } = 10;
}

public class GetTodoItemsWithConditionQueryHandler : IRequestHandler<GetTodoItemsWithConditionQuery, PaginatedList<TodoItemDto>>
{
    private readonly IRepository<TodoItem> _repository;
    private readonly IMapper _mapper;

    public GetTodoItemsWithConditionQueryHandler(IRepository<TodoItem> repository, IMapper mapper)
    {
        _repository = repository;
        _mapper = mapper;
    }

    public async Task<PaginatedList<TodoItemDto>> Handle(GetTodoItemsWithConditionQuery request, CancellationToken cancellationToken)
    {
        var spec = new TodoItemSpec(request);
        return await _repository
            .GetAsQueryable(spec)
            .ProjectTo<TodoItemDto>(_mapper.ConfigurationProvider)
            .PaginatedListAsync(request.PageNumber, request.PageSize);
    }
}

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

  • TodoItemSpec.cs
// 省略其他...
public TodoItemSpec(GetTodoItemsWithConditionQuery query) : 
    base(x => x.ListId == query.ListId 
              && (!query.Done.HasValue || x.Done == query.Done) 
              && (!query.PriorityLevel.HasValue || x.Priority == query.PriorityLevel)
              && (string.IsNullOrEmpty(query.Title) || x.Title!.Trim().ToLower().Contains(query.Title!.ToLower())))
{
    if (string.IsNullOrEmpty(query.SortOrder))
        return;
    switch (query.SortOrder)
    {
        // 仅作有限的演示
        default:
            ApplyOrderBy(x => x.Title!);
            break;
        case "title_desc":
            ApplyOrderByDescending(x =>x .Title!);
            break;
        case "priority_asc":
            ApplyOrderBy(x => x.Priority);
            break;
        case "priority_desc": 
            ApplyOrderByDescending(x => x.Priority); 
            break;
    }
}

验证

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

  • 请求
    image

  • 响应
    image

总结

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

文章来源:https://www.cnblogs.com/code4nothing/p/build-todolist-16.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:基于欧姆龙PLC#FinsTcp协议上位机通讯(一)-PLC配置
下一篇:放弃 AutoMapper ,拥抱 Mapster
评论列表

发表评论

评论内容
昵称:
关联文章

使用.NET 6开发TodoList应用(16)——实现查询排序
使用.NET 6开发TodoList应用(15)——实现查询搜索
使用.NET 6开发TodoList应用(14)——实现查询过滤
使用.NET 6开发TodoList应用(13)——实现查询分页
使用.NET 6开发TodoList应用(12)——实现ActionFilter
使用.NET 6开发TodoList应用(22)——实现缓存
使用.NET 6开发TodoList应用(9)——实现PUT请求
使用.NET 6开发TodoList应用(25)——实现RefreshToken
使用.NET 6开发TodoList应用(17)——实现数据塑形
使用.NET 6开发TodoList应用(7)——使用AutoMapper实现GET请求
使用.NET 6开发TodoList应用(31)——实现基于Github Actions和ACI的CI/CD
使用.NET 6开发TodoList应用(6)——使用MediatR实现POST请求
使用.NET 6开发TodoList应用(29)——实现静态字符串本地化功能
使用.NET 6开发TodoList应用(21)——实现API版本控制
使用.NET 6开发TodoList应用(28)——实现应用程序健康检查
使用.NET 6开发TodoList应用(11)——使用FluentValidation和MediatR实现接口请求验证
使用.NET 6开发TodoList应用(30)——实现Docker打包和部署
使用.NET 6开发TodoList应用(23)——实现请求限流
使用.NET 6开发TodoList应用(8)——实现全局异常处理
使用.NET 6开发TodoList应用(填坑1)——实现当前登录用户获取

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码