解答网友提问:如何构建动态表达式实现高级查询服务
生活随笔
收集整理的這篇文章主要介紹了
解答网友提问:如何构建动态表达式实现高级查询服务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上次我們介紹了"一秒創建高級查詢服務"。前天,有網友在公眾號后臺問我,怎么使用動態表達式:
我想應該是客戶提出了更高的要求,查詢的條件不僅限于大于、小于,更加多樣化,需要動態組合成條件,類似下圖:?
那么,有不有什么方式能快速實現這一業務要求呢?!
思考
我們使用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“,記住我!
總結
以上是生活随笔為你收集整理的解答网友提问:如何构建动态表达式实现高级查询服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不止 Windows 10!Window
- 下一篇: .net core 下的分布式事务锁