日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

解答网友提问:如何构建动态表达式实现高级查询服务

發布時間:2023/12/4 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解答网友提问:如何构建动态表达式实现高级查询服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上次我們介紹了"一秒創建高級查詢服務"。前天,有網友在公眾號后臺問我,怎么使用動態表達式:

我想應該是客戶提出了更高的要求,查詢的條件不僅限于大于、小于,更加多樣化,需要動態組合成條件,類似下圖:?

那么,有不有什么方式能快速實現這一業務要求呢?!

思考

我們使用IQueryable去查詢數據,那么只需要傳入的參數能夠轉成Lambda表達式就可以了。

當然,可以使用Expression.Lambda方法去動態創建表達式樹,但是那樣對傳入的數據模型格式有一定要求。

能不能就用字符串生成動態表達式呢?

實現方式

Roslyn是微軟開源的.NET編譯器,但是鮮為人知的,它還提供了CSharp scripting API。

創建Asp.Net Core Web API項目,引用Nuget包Microsoft.CodeAnalysis.CSharp.Scripting。

然后,修改WeatherForecastController.cs的Get方法,假定查詢條件是從前端拼接后傳遞過來的:

[HttpGet] public?async?Task<IEnumerable<WeatherForecast>>?Get() {//溫度大于20,?Summary必須以C開頭var?filter?=?@"p?=>?p.TemperatureC?>?20?&&?p.Summary.StartsWith(""C"")";//由于使用了String.StartsWith,所以要引用String所在的Assemblyvar?options?=?ScriptOptions.Default.AddReferences(typeof(WeatherForecast).Assembly,typeof(String).Assembly);Func<WeatherForecast,?bool>?expression?=?await?CSharpScript.EvaluateAsync<Func<WeatherForecast,?bool>>(filter,?options);var?rng?=?new?Random();return?Enumerable.Range(1,?5).Select(index?=>?new?WeatherForecast{TemperatureC?=?rng.Next(-20,?55),Summary?=?Summaries[rng.Next(Summaries.Length)]}).AsQueryable().Where(expression).ToArray(); }

運行程序,可以看到只返回滿足條件的數據(默認應該是5條),如下圖:?

結論

需要注意的是,動態編譯肯定是有一定的性能損失的,這就要看業務上如何取舍了。

歡迎大家到公眾號后臺留言與我交流。如果你有更好的實現方式,也可以告訴我!

如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“,記住我!

總結

以上是生活随笔為你收集整理的解答网友提问:如何构建动态表达式实现高级查询服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。