编写优雅代码,从挖掉恶心的if/else 开始
背景
長話短說, 作為開發(fā)人員經(jīng)常需要根據(jù)條件靈活查詢數(shù)據(jù)庫,不管你是用rawsql 還是EFCore, 以下類似偽代碼大家都可能遇到:
? ?特別是在大數(shù)據(jù)產(chǎn)品或者物聯(lián)網(wǎng)產(chǎn)品中,字段甚多;if/else 寫到死,一邊寫一邊吐。
? ?寫出優(yōu)雅漂亮的代碼,從移除if/else 開始。
頭腦風(fēng)暴
從靈活查詢的要求看,每一個(gè)字段都有為null 或 不為null 的可能, 以上偽代碼6個(gè)字段, 理論上最終執(zhí)行查詢時(shí)形成的sql 共有2^6= 64種可能。
現(xiàn)在我們要寫這么多if 語法,是因?yàn)?#xff1a;
? -? 在編碼階段,強(qiáng)制判斷字段存在, 并據(jù)此組裝 rawsql
? -? 在編碼階段,強(qiáng)制判斷字段存在,并據(jù)此使用lambda強(qiáng)類型 構(gòu)造IQueryable
為了解決這個(gè)痛點(diǎn), 引入動(dòng)態(tài)Linq,動(dòng)態(tài)Linq的不同之處在于 查詢方法的參數(shù)不限于強(qiáng)類型的lamdba表達(dá)式,而是可以使用字符串;
使用字符串,意味著我們可在運(yùn)行時(shí)動(dòng)態(tài)決定查詢內(nèi)容
? 同時(shí)由于我們在服務(wù)端可完全抓取QueryString(可一次性組裝動(dòng)態(tài)Linq字符串), 故動(dòng)態(tài)靈活構(gòu)建查詢的方案呼之欲出。
編碼實(shí)踐
以上面?zhèn)未a業(yè)務(wù)舉例, 根據(jù)條件靈活查詢。
1. ?nuget引入DynamicLinq:
Install-Package Microsoft.EntityFrameworkCore.DynamicLinq -Version 1.0.192. 定義EFCore 查詢實(shí)體類:
3. Query集合抓取所有QueryString,列舉字段的方式?判斷字段為null, 并構(gòu)造查詢
?EFCore生成的SQL如下:
SELECT [c].[Id], [c].[car_id], [c].[car_version], [c].[config_content], [c].[config_version], [c].[so_version], [c].[user_id]FROM [car_energy_model] AS [c]
WHERE (((([c].[car_version] = N'FT_Version_3.2') AND ([c].[car_id] = N'CD292FE0900X')) AND ([c].[user_id] = N'u_1960988792x')) AND ([c].[so_version] = N'so_ver1.2')) AND ([c].[config_version] = N'cv_1.2')
ok, That‘s all?
移除惡心的 if、else之后代碼是不是看起來更優(yōu)雅一些。
總結(jié)
以上場景相信很多開發(fā)者都會(huì)遇到,特別是進(jìn)階到一定水平,移除if/else ?的欲望愈加強(qiáng)烈。
再次強(qiáng)化本文 知識點(diǎn):? ?
DynamicLinq 具備動(dòng)態(tài)形成查詢條件的能力,不再依靠lambda 強(qiáng)類型表達(dá)式,而是根據(jù)構(gòu)造的查詢字符串,內(nèi)部解析成查詢條件。
--------------------2019/9/23 下班前更新--------------------------------------
DynamicLinq ?若動(dòng)態(tài)組裝String,確實(shí)存在 SQL注入問題, 使用placeholder 可避免。
更新代碼:
原文鏈接:https://www.cnblogs.com/JulianHuang/p/11567322.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的编写优雅代码,从挖掉恶心的if/else 开始的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从单机应用到微服务,用户认证走几步?
- 下一篇: 推荐neter常用优秀开源项目系列之一