ynamic LINQ創(chuàng)建高級(jí)查詢服務(wù)
前言:
在業(yè)務(wù)開發(fā)中,一個(gè)常用的功能就是“高級(jí)查詢”,就是客戶可以根據(jù)自己的需要設(shè)置查詢條件查找數(shù)據(jù),類似下圖:
通常,我們需要為每個(gè)“高級(jí)查詢”定制Dto類,用于傳輸條件,并要根據(jù)條件組合成查詢語(yǔ)句執(zhí)行數(shù)據(jù)庫(kù)查詢操作,費(fèi)時(shí)費(fèi)力。
現(xiàn)在,使用AutoFilterer.Generators可以輕松實(shí)現(xiàn)上述功能。
一、創(chuàng)建高級(jí)查詢服務(wù)
舉例:
創(chuàng)建Asp.Net Core Web API
項(xiàng)目,引用Nuget包AutoFilterer.Generators。
在WeatherForecast
類上添加GenerateAutoFilterAttribute
:
[GenerateAutoFilter] public class WeatherForecast { ? ? public DateTime Date { get; set; } ? ? public int TemperatureC { get; set; } ? ? public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); ? ? public string Summary { get; set; } }
然后,修改WeatherForecastController.cs
的Get方法,增加WeatherForecastFilter
參數(shù):
[HttpGet]:
public IEnumerable<WeatherForecast> Get([FromQuery]WeatherForecastFilter filter) { ? ? var rng = new Random(); ? ? // Change range to 100 from 5 to get more reasonable results. ? ? return Enumerable.Range(1, 100).Select(index => new WeatherForecast ? ? { ? ? ? ? Date = DateTime.Now.AddDays(index), ? ? ? ? TemperatureC = rng.Next(-20, 55), ? ? ? ? Summary = Summaries[rng.Next(Summaries.Length)] ? ? }) ? ? .AsQueryable().ApplyFilter(filter)//使用filter ? ? .ToArray(); }
AutoFilterer.Generators提供了IQueryable.ApplyFilter(filter)擴(kuò)展方法,可以根據(jù)高級(jí)查詢條件進(jìn)行數(shù)據(jù)篩選。
運(yùn)行程序,可以在Swagger UI看到如下圖:
現(xiàn)在,“高級(jí)查詢”服務(wù)已經(jīng)完成了。你可以傳入最小最大值范圍,排序方式,分頁(yè)方式。
結(jié)論:
AutoFilterer.Generators提供了很便利的方式實(shí)現(xiàn)“高級(jí)查詢”,如果大家有類似的業(yè)務(wù)需求,可以試一下
但是,??AutoFilterer.Generators??只能提供簡(jiǎn)單的范圍篩選:
今天,我們介紹如何使用Dynamic LINQ輕松實(shí)現(xiàn)更強(qiáng)大的高級(jí)查詢服務(wù)。
二、使用Dynamic LINQ創(chuàng)建高級(jí)查詢服務(wù)
舉例:
創(chuàng)建ASP.NET Core Web API項(xiàng)目,引用Nuget包??System.Linq.Dynamic.Core??。
并在WeatherForecastController.cs頭部添加:
using System.Linq.Dynamic.Core;
?1.定義查詢參數(shù)?
創(chuàng)建??DynamicLinqDto
??,用于傳遞返回字段、查詢條件、排序方式、分頁(yè)方式等:
public class DynamicLinqDto { ? ? public string Fields { get; set; } ? ? public string Filter { get; set; } ? ? public string OrderBy { get; set; } ? ? ? ?? ? ? public int? PageNo { get; set; } ? ? public int? PageSize { get; set; } }
?2.實(shí)現(xiàn)查詢方法?
修改默認(rèn)的Get方法如下:
[HttpGet]:
[ProducesDefaultResponseType(typeof(WeatherForecast))] public IEnumerable<dynamic> Get([FromQuery] DynamicLinqDto dto) { ? ? var rng = new Random(); ? ? IQueryable query = Enumerable.Range(1, 5).Select(index => new WeatherForecast ? ? { ? ? ? ? Date = DateTime.Now.AddDays(index), ? ? ? ? TemperatureC = rng.Next(-20, 55), ? ? ? ? Summary = Summaries[rng.Next(Summaries.Length)] ? ? }) ? ? .AsQueryable(); ? ? return query.ToDynamicArray(dto); }
由于Get方法的返回類型是IEnumerable
,因此需要使用??ProducesDefaultResponseTypeAttribute
??指定實(shí)際返回的類型,以便Swagger頁(yè)面能顯示正確:
?3.實(shí)現(xiàn)擴(kuò)展方法?
上面最關(guān)鍵的代碼是??ToDynamicArray??方法。
實(shí)際上,這是我們封裝的擴(kuò)展方法,對(duì)于任意??IQueryable??對(duì)象,實(shí)現(xiàn)高級(jí)查詢:
public static class DynamicLinqExtentions { ? ? public static dynamic[] ToDynamicArray(this IQueryable query, DynamicLinqDto dto) ? ? { ? ? ? ? if (!string.IsNullOrWhiteSpace(dto.Fields)) ? ? ? ? { ? ? ? ? ? ? query = query.Select($@"new({dto.Fields})"); ? ? ? ? } ? ? ? ? if (!string.IsNullOrWhiteSpace(dto.Filter)) ? ? ? ? { ? ? ? ? ? ? query = query.Where(dto.Filter); ? ? ? ? } ? ? ? ? if (!string.IsNullOrWhiteSpace(dto.OrderBy)) ? ? ? ? { ? ? ? ? ? ? query = query.OrderBy(dto.OrderBy); ? ? ? ? } ? ? ? ? var pageNo = dto.PageNo ?? 1; ? ? ? ? var pageSize = dto.PageSize ?? 10; ? ? ? ? query = query.Page(pageNo, pageSize); ? ? ? ? return query.ToDynamicArray(); ? ? } }
?4.效果?
運(yùn)行程序,傳入指定的參數(shù)并執(zhí)行:
可以看到,現(xiàn)在,“高級(jí)查詢”服務(wù)已經(jīng)完成了:
結(jié)論:
可以看到Dynamic LINQ LINQ 使實(shí)現(xiàn)起來(lái)相當(dāng)容易,詳細(xì)參數(shù)說(shuō)明請(qǐng)參看官方文檔
到此這篇關(guān)于ynamic LINQ創(chuàng)建高級(jí)查詢服務(wù)的文章就介紹到這了,更多相關(guān)ynamic LINQ創(chuàng)建高級(jí)查詢服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET讓FileUpload控件支持瀏覽自動(dòng)上傳功能的解決方法
這篇文章主要介紹了ASP.NET讓FileUpload控件支持瀏覽自動(dòng)上傳功能的解決方法,很實(shí)用的技巧,需要的朋友可以參考下2014-07-07C#圖片截取壓縮(百分比壓縮/大小壓縮)實(shí)現(xiàn)代碼
為了娛樂(lè)寫了個(gè)截取圖片和壓縮圖片你的小工具:按照百分比壓縮/制定大小壓縮等等,感興趣的朋友可以了解下啊,希望本文對(duì)你學(xué)些c#圖片知識(shí)有所幫助2013-01-01在.NET使用JSON作為數(shù)據(jù)交換格式實(shí)例演示
JSON(JavaScript Object Notation)是一種輕量級(jí)輕量級(jí)的數(shù)據(jù)交換格式,并且它獨(dú)立于編程語(yǔ)言,接下來(lái)為大家介紹下使用JSON作為數(shù)據(jù)交換格式在.net中的應(yīng)用2013-03-03asp.net顯示圖片到指定的Image控件中 具體實(shí)現(xiàn)
這篇文章介紹了asp.net顯示圖片到指定的Image控件中 具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-11-11解決 The Controls collection cannot be modified because the co
在.aspx或.ascx的如果包括%,并在.aspx, .ascs中使用了AjaxToolkit中的控件,那么很可能會(huì)引發(fā)這個(gè)問(wèn)題,下面給出具體的解決方法。2010-10-10asp.net Http異常eurl.axd出錯(cuò)信息解決方法
在IIS6中同時(shí)啟用了ASP.NET 2.0 和 ASP.NET 4.0 后,網(wǎng)站程序可能會(huì)出現(xiàn)如下錯(cuò)誤:“ System.Web.HttpException: Path ‘//eurl.axd/‘ was not found. ”2011-08-08密碼綁定至密碼文本框中(TextMode設(shè)為Password)
一般情況之下TextBox的TextMode設(shè)為Password話,我們想在后臺(tái)(.cs)綁定一個(gè)值至此文本框,是無(wú)法實(shí)現(xiàn)的,如果一定要綁定值的話,該如何實(shí)現(xiàn)呢?,本文將告訴你實(shí)現(xiàn)方法,感興趣的朋友可以參考下2013-01-01