日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编写优雅代码,从挖掉恶心的if/else 开始

發布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写优雅代码,从挖掉恶心的if/else 开始 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


背景

  長話短說, 作為開發人員經常需要根據條件靈活查詢數據庫,不管你是用rawsql 還是EFCore, 以下類似偽代碼大家都可能遇到:


? ?特別是在大數據產品或者物聯網產品中,字段甚多;if/else 寫到死,一邊寫一邊吐。

? ?寫出優雅漂亮的代碼,從移除if/else 開始。

頭腦風暴

  從靈活查詢的要求看,每一個字段都有為null 或 不為null 的可能, 以上偽代碼6個字段, 理論上最終執行查詢時形成的sql 共有2^6= 64種可能。

現在我們要寫這么多if 語法,是因為:

? -? 在編碼階段,強制判斷字段存在, 并據此組裝 rawsql

? -? 在編碼階段,強制判斷字段存在,并據此使用lambda強類型 構造IQueryable

為了解決這個痛點, 引入動態Linq,動態Linq的不同之處在于 查詢方法的參數不限于強類型的lamdba表達式,而是可以使用字符串;

使用字符串,意味著我們可在運行時動態決定查詢內容


? 同時由于我們在服務端可完全抓取QueryString(可一次性組裝動態Linq字符串), 故動態靈活構建查詢的方案呼之欲出。

編碼實踐

以上面偽代碼業務舉例, 根據條件靈活查詢。

1. ?nuget引入DynamicLinq:

Install-Package Microsoft.EntityFrameworkCore.DynamicLinq -Version 1.0.19

2. 定義EFCore 查詢實體類:


3. Query集合抓取所有QueryString,列舉字段的方式?判斷字段為null, 并構造查詢


?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之后代碼是不是看起來更優雅一些。

總結

以上場景相信很多開發者都會遇到,特別是進階到一定水平,移除if/else ?的欲望愈加強烈。

再次強化本文 知識點:? ?

  DynamicLinq 具備動態形成查詢條件的能力,不再依靠lambda 強類型表達式,而是根據構造的查詢字符串,內部解析成查詢條件。

--------------------2019/9/23 下班前更新--------------------------------------

DynamicLinq ?若動態組裝String,確實存在 SQL注入問題, 使用placeholder 可避免。

更新代碼:

原文鏈接:https://www.cnblogs.com/JulianHuang/p/11567322.html


.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?


總結

以上是生活随笔為你收集整理的编写优雅代码,从挖掉恶心的if/else 开始的全部內容,希望文章能夠幫你解決所遇到的問題。

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