.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)查詢排序
需求
關(guān)于查詢的另一個(gè)需求是要根據(jù)前端請(qǐng)求的排序字段進(jìn)行對(duì)結(jié)果相應(yīng)的排序。
目標(biāo)
實(shí)現(xiàn)根據(jù)排序要求返回排序后的結(jié)果
原理與思路
要實(shí)現(xiàn)根據(jù)前端請(qǐng)求的進(jìn)行相應(yīng)排序,結(jié)合我們之前寫好的Specification,可以比較簡單地做到。
實(shí)現(xiàn)
我們還是用TodoItem請(qǐng)求來舉例,再添加一個(gè)排序字段到查詢請(qǐng)求中:
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);
}
}
同時(shí)把原本寫在查詢中的條件整合到了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;
}
}
驗(yàn)證
啟動(dòng)Api項(xiàng)目,執(zhí)行查詢TodoItem的請(qǐng)求:
請(qǐng)求

響應(yīng)

總結(jié)
這樣我們就完成了根據(jù)前端需求進(jìn)行后端排序并返回結(jié)果的需求,下一篇文章我們將介紹查詢中的最后一個(gè)不是很常用,但是在某些情況下很有用的概念:數(shù)據(jù)塑形。
到此這篇關(guān)于.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)查詢排序 的文章就介紹到這了,更多相關(guān).NET 6實(shí)現(xiàn)查詢排序 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- .NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)查詢分頁
- .NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)接口請(qǐng)求驗(yàn)證
- .NET?6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)DELETE請(qǐng)求與HTTP請(qǐng)求冪等性
- .NET6使WebApi獲取訪問者IP地址
- .NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)PUT請(qǐng)求
- .NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)全局異常處理
- .NET 6開發(fā)TodoList應(yīng)用之使用AutoMapper實(shí)現(xiàn)GET請(qǐng)求
相關(guān)文章
asp.net基于JWT的web api身份驗(yàn)證及跨域調(diào)用實(shí)踐
這篇文章主要介紹了asp.net基于JWT的web api身份驗(yàn)證及跨域調(diào)用實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
asp.net中使用cookie與md5加密實(shí)現(xiàn)記住密碼功能的實(shí)現(xiàn)代碼
雖然.net內(nèi)置了登陸控件,有記住密碼的功能,但還是想自己實(shí)踐一下,以下代碼主要應(yīng)用了COOKIE,包括安全加密的過程等2013-02-02
在.Net?Framework應(yīng)用中請(qǐng)求HTTP2站點(diǎn)的問題解析
隨著各大瀏覽器支持和蘋果的帶頭效應(yīng),HTTP2的應(yīng)用會(huì)越來越廣泛,但是規(guī)模龐大的.NET?Framework應(yīng)用卻也不能為了連接HTTP2就升級(jí)到NET?Core平臺(tái)。通過本文提供的方案,可以最小成本的實(shí)現(xiàn).NET?Framework應(yīng)用成功訪問HTTP2站點(diǎn),感興趣的朋友跟隨小編一起看看吧2022-07-07
DropDownList 下拉框選擇改變促發(fā)事件和防全局刷新(推薦)
這篇文章主要介紹了DropDownList 下拉框選擇改變促發(fā)事件和防全局刷新(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
CentOS上運(yùn)行ZKEACMS的詳細(xì)過程
這篇文章主要為大家介紹了CentOS上運(yùn)行ZKEACMS的詳細(xì)過程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
DropDownList根據(jù)下拉項(xiàng)的Text文本序號(hào)排序
在某些時(shí)候表中沒有可以排序的字段同時(shí)呢也不想修改表結(jié)構(gòu),但它的項(xiàng)文本有序號(hào)這時(shí)就可以用這方法排序,感興趣的你可以參考下,或許本文知識(shí)點(diǎn)對(duì)你有所幫助2013-03-03
iis訪問出現(xiàn)各種問題(Vs訪問正常)的部分處理方法詳細(xì)整理
在vs中調(diào)試都可以正常,但是在iis訪問就會(huì)出現(xiàn)各種問題,很是疑惑索性把這些問題整理一下,這樣更容易的可以處理方法說明清楚,感興趣的朋友可以了解下2013-01-01

