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