使用Dynamic LINQ创建高级查询服务
生活随笔
收集整理的這篇文章主要介紹了
使用Dynamic LINQ创建高级查询服务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
在以前的文章中,我們介紹了使用AutoFilterer.Generators創建高級查詢服務。
但是,AutoFilterer.Generators只能提供簡單的范圍篩選:
今天,我們介紹如何使用Dynamic LINQ輕松實現更強大的高級查詢服務。
Demo
創建ASP.NET Core Web API項目,引用Nuget包System.Linq.Dynamic.Core。
并在WeatherForecastController.cs頭部添加:
using?System.Linq.Dynamic.Core;1.定義查詢參數
創建DynamicLinqDto,用于傳遞返回字段、查詢條件、排序方式、分頁方式等:
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.實現查詢方法
修改默認的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指定實際返回的類型,以便Swagger頁面能顯示正確:
3.實現擴展方法
上面最關鍵的代碼是ToDynamicArray方法。
實際上,這是我們封裝的擴展方法,對于任意IQueryable對象,實現高級查詢:
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.效果
運行程序,傳入指定的參數并執行:
可以看到,現在,“高級查詢”服務已經完成了:
結論
可以看到Dynamic LINQ使實現起來相當容易。詳細參數說明請參看官方文檔:https://dynamic-linq.net/
想了解更多內容,請關注我的個人公眾號”My IO“
總結
以上是生活随笔為你收集整理的使用Dynamic LINQ创建高级查询服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 异步方法的异常处理
- 下一篇: ABP vNext微服务架构详细教程——