最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)查詢分頁

 更新時(shí)間:2022年01月01日 08:26:34   作者:CODE4NOTHING  
這篇文章介紹了.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)查詢分頁,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

需求

查詢中有個(gè)非常常見的需求就是后端分頁,實(shí)現(xiàn)的方式也不算復(fù)雜,所以我們本文僅僅演示一個(gè)后端查詢分頁的例子。

目標(biāo)

實(shí)現(xiàn)分頁查詢返回。

原理與思路

對于分頁查詢而言,我們需要在請求中獲取當(dāng)前請求的是第幾頁,每頁請求多少項(xiàng)數(shù)據(jù)。在返回值中需要告訴前端,當(dāng)前這一頁的所有數(shù)據(jù)項(xiàng)列表,總共的數(shù)據(jù)項(xiàng)有多少。為此我們可以定義一個(gè)包裝類型,供系統(tǒng)中所有需要提供后端分頁查詢返回值使用。

除了最基本的實(shí)現(xiàn)方式之外,我們可能還需要實(shí)現(xiàn)關(guān)于分頁數(shù)據(jù)結(jié)構(gòu)的AutoMapper轉(zhuǎn)換映射,避免手動(dòng)重復(fù)實(shí)現(xiàn)。

實(shí)現(xiàn)

定義分頁結(jié)果數(shù)據(jù)結(jié)構(gòu)

我們在Application/Common/Models中定義一個(gè)類,表示分頁結(jié)果。

PaginatedList.cs

using Microsoft.EntityFrameworkCore;

namespace TodoList.Application.Common.Models;

public class PaginatedList<T>
{
    public List<T> Items { get; }
    public int PageNumber { get; }
    public int TotalPages { get; }
    public int TotalCount { get; }

    public PaginatedList(List<T> items, int count, int pageNumber, int pageSize)
    {
        PageNumber = pageNumber;
        TotalPages = (int)Math.Ceiling(count / (double)pageSize);
        TotalCount = count;
        Items = items;
    }

    // 增加屬性表示是否有前一頁
    public bool HasPreviousPage => PageNumber > 1;
    // 增加屬性表示是否有后一頁
    public bool HasNextPage => PageNumber < TotalPages;

    // 分頁結(jié)果構(gòu)建輔助方法
    public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageNumber, int pageSize)
    {
        var count = await source.CountAsync();
        // 注意我們給的請求中pageNumber是從1開始的
        var items = await source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync();

        return new PaginatedList<T>(items, count, pageNumber, pageSize);
    }
}

添加對于分頁結(jié)果的Mapping Profile

Application/Common/Mappings中新增一個(gè)類用于實(shí)現(xiàn)關(guān)于分頁結(jié)果的擴(kuò)展方法:

MappingExtensions.cs

using AutoMapper;
using AutoMapper.QueryableExtensions;
using Microsoft.EntityFrameworkCore;
using TodoList.Application.Common.Models;

namespace TodoList.Application.Common.Mappings;

public static class MappingExtensions
{
    public static Task<PaginatedList<TDestination>> PaginatedListAsync<TDestination>(this IQueryable<TDestination> queryable, int pageNumber, int pageSize)
    {
        return PaginatedList<TDestination>.CreateAsync(queryable, pageNumber, pageSize);   
    }

    public static Task<List<TDestination>> ProjectToListAsync<TDestination>(this IQueryable queryable, IConfigurationProvider configuration)
    {
        return queryable.ProjectTo<TDestination>(configuration).ToListAsync();
    }
}

創(chuàng)建分頁查詢請求

為了演示分頁查詢的應(yīng)用,我們新增一個(gè)允許分頁查詢TodoItemQuery

GetTodoItemsWithPaginationQuery.cs

using System.Linq;
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;

namespace TodoList.Application.TodoItems.Queries.GetTodoItems;

public class GetTodoItemsWithPaginationQuery : IRequest<PaginatedList<TodoItemDto>>
{
    public Guid ListId { get; set; }
    public int PageNumber { get; set; } = 1;
    public int PageSize { get; set; } = 10;
}

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

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

    public async Task<PaginatedList<TodoItemDto>> Handle(GetTodoItemsWithPaginationQuery request, CancellationToken cancellationToken)
    {
        return await _repository
            .GetAsQueryable(x => x.ListId == request.ListId)
            .OrderBy(x => x.Title)
            .ProjectTo<TodoItemDto>(_mapper.ConfigurationProvider)
            .PaginatedListAsync(request.PageNumber, request.PageSize);
    }
}

創(chuàng)建查詢Controller

TodoItemController.cs

// 對于查詢來說,一般參數(shù)是來自查詢字符串的,所以這里用[FromQuery]
[HttpGet]
public async Task<ApiResponse<PaginatedList<TodoItemDto>>> GetTodoItemsWithPagination([FromQuery] GetTodoItemsWithPaginationQuery query)
{
    return ApiResponse<PaginatedList<TodoItemDto>>.Success(await _mediator.Send(query));
}

驗(yàn)證

啟動(dòng)Api項(xiàng)目,執(zhí)行創(chuàng)建TodoList的請求:

請求

響應(yīng)

總結(jié)

對于后端排序的需求來說,實(shí)現(xiàn)起來并不復(fù)雜,但是在這個(gè)分頁的過程中,要注意一定要以某個(gè)不會(huì)輕易變動(dòng)的字段來作為排序的鍵,否則會(huì)在多次請求后續(xù)頁的過程中出現(xiàn)因?yàn)樽侄巫儎?dòng)導(dǎo)致排序結(jié)果變動(dòng)進(jìn)而引發(fā)分頁結(jié)果的前后不一致的情況。

到此這篇關(guān)于.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)查詢分頁的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

新津县| 阿荣旗| 马尔康县| 体育| 南皮县| 胶南市| 广安市| 孝昌县| 新田县| 宝坻区| 康保县| 固阳县| 天气| 册亨县| 上蔡县| 北辰区| 永安市| 安宁市| 邵武市| 江口县| 平乡县| 土默特左旗| 鹿邑县| 石阡县| 东乌| 长顺县| 正蓝旗| 大悟县| 弥勒县| 浦县| 安顺市| 宝鸡市| 敦化市| 泌阳县| 叙永县| 堆龙德庆县| 马关县| 贺兰县| 乌兰浩特市| 揭阳市| 布尔津县|