昨天開源了業務業餘時間自己封裝的dapper lambda擴充,同時寫了篇博文《編寫自己的dapper lambda擴充-使用篇》簡單的介紹了下其使用,今天将分享下它的設計思路
其實就是将多個方法通過點(.)将它們串接起來,讓代碼更加簡潔, 可讀性更強。
其原理是類的調用方法的傳回值類型為類本身或其基類,選擇傳回基類的原因是為了做降級限制,例如我希望使用了Top之後接着Select和ToList,無法再用where或orderBy。

View Code
以上為基本的設計模型,具體實作如有問題可以檢視我的源碼。
具體實作的時候會涉及到很多的表達式樹的解析,例如where條件、部分字段update,而我實作的時候一共兩步:先修樹,再翻譯。然而無論哪步都得對表達式樹進行周遊。
百度的定義:也稱為“表達式目錄樹”,以資料形式表示語言級代碼,它是一種抽象文法樹或者說是一種資料結構。
我對它的了解是,它本質是一個二叉樹,節點擁有自己的屬性像nodetype。
而它的周遊方式為前序周遊
百度的定義:曆首先通路根結點然後周遊左子樹,最後周遊右子樹。在周遊左、右子樹時,仍然先通路根結點,然後周遊左子樹,最後周遊右子樹,以下圖為例
其周遊結果為:ABDECF
以一個實際例子:
從上圖可以看出,我們會先周遊到根節點的NodeType AndAlso翻譯為 and ,然後到節點2,NodeType的Equal翻譯為 = ,再到3節點翻譯為 Name,再到4節點翻譯為'skychen',那麼将3、4節點拼接起來就為Name = 'skychen',如果類推6、7為Age >= 18,最後拼接這個語句為 Name = 'skychen' and Age >= 18。
修樹的目的,為了我們更好的翻譯,例如DateTime.Now表達式樹裡的NodeType為MemberAccess,我希望轉換成NodeType為Constant類型,以'2018-06-27 16:18:00'這個值作為翻譯。
以上為設計和實作的要點,具體的實作問題可以檢視源碼,如果有建議和疑問可以在下方留言,如果對您起到作用,希望您點一下推薦作為對我的支援。
再次雙手奉上源碼:https://github.com/SkyChenSky/Sikiro.DapperLambdaExtension.MsSql
作 者:
陳珙
出 處:http://www.cnblogs.com/skychen1218/
關于作者:專注于微軟平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。
聲援部落客:如果您覺得文章對您有幫助,可以點選文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!