前言
去年我在業餘時間,自己整了一套dapper的lambda表達式的封裝,原本是作爲了一個個人的娛樂項目,當時也只支持了Sql Server數據庫。隨之開源後,有不少朋友也對此做了試用,也對我這個項目提出了不少的建議。因此我在最近公司業務不怎麼繁忙的情況下,對朋友們的建議和我的想法做了一個總結,然後花了一個星期的時間對項目進行了重構與升級,希望該項目能幫助到有需要的人。
如果您對它有興趣,歡迎大家提交Pull Request代碼變更,如果有任何問題可提交issue進行討論。當然也可以在下方評論和QQ私聊給我。爲該文章點個推薦或者給項目點star都是給我最大的動力與支持,謝謝。
源碼
https://github.com/SkyChenSky/Sikiro.Dapper.Extension
文檔
具體使用可以查看文檔:
https://github.com/SkyChenSky/Sikiro.Dapper.Extension/wiki
設計理念
該項目主要目的是通過使用lambda表達式達到以下效果:
- 提高開發效率
- 強類型。
- 智能提示
- 編譯錯誤提示
該擴展主要解決重複性較大的簡單查詢,因此並不提供鏈表(JOIN)操作,如果是簡單的鏈表可以通過編寫視圖,再使用該擴展組件。如果是複雜查詢,建議手寫SQL+原生Dapper方法。
版本改動
數據庫支持
原本項目名爲Sikiro.DapperLambdaExtension.MsSql,現更名爲Sikiro.Dapper.Extension,同時支持三種數據庫 MsSQL、MySQL、PostgreSQL。
MsSql
PM> Install-Package Sikiro.Dapper.Extension.MsSql
MySql
PM> Install-Package Sikiro.Dapper.Extension.MySql
PostgreSql
PM> Install-Package Sikiro.Dapper.Extension.PostgreSql
異步方法支持
對於數據庫訪問這種強I/O操作的,可以在合理的場景下使用異步方法提高應用處理併發能力。支持方法有:
- ToListAsync
- GetAsync
- InsertAsync
- DeleteAsync
- UpdateSelectAsync
- UpdateAsync
框架重構
框架主要分爲兩部分:
Sikiro.Dapper.Extension 爲公共抽象庫,主要是接口、抽象類與公共方法
Sikiro.Dapper.Extension.XXX 爲具體實現庫,主要是重寫不同數據庫的特性與語句組合。
Sikiro.Dapper.Extension 類圖
Sikiro.Dapper.Extension.MsSql類圖
其他特性
鏈式風格
Query
con.QuerySet<SysUser>().Where(a => a.Email == "[email protected]") .OrderBy(a => a.CreateDatetime) .Select(a => new SysUser { Email = a.Email, CreateDatetime = a.CreateDatetime, SysUserid = a.SysUserid }) .PageList(1, 10);
Command
con.CommandSet<SysUser>().Where(a => a.Email == "[email protected]").Update(a => new SysUser { Email = "[email protected]" });
忠於原生的特性標籤
不標新立異,方便替換組件
[Table("SYS_USER")] [Key] [Required] [StringLength(32)] [Display(Name = "主鍵")] [Column("SYS_USERID")] [DatabaseGenerated]
高併發處理的UpdateSelect
該方法主要用於把符合條件的數據更新後並查詢出來,並通過READPAST過濾了已被鎖的數據。具體所生成的SQL語句如下:
UPDATE TOP ( 100 ) SYS_USER WITH ( UPDLOCK, READPAST ) SET USER_STATUS = 1 OUTPUT INSERTED.[USER_NAME] , INSERTED.SYS_USERID , INSERTED.EMAIL FROM SYS_USER WHERE CREATE_DATETIME < '2018-09-13' AND USER_STATUS = 2;
那麼該方法有他的使用場景,在我們公司現有業務,資金定時服務就是通過使用UpdateSelect方法輪詢數據源,把需要處理的數據庫先UpdateSelect成一箇中間狀態,然後再與第三方接口做交互處理,假如此時有多個資金定時服務並行去跑,A-Job會跑取前100條數據,B-Job會因爲READPAST的原因過濾了A-JOB所鎖的前1-100條而讀取了第101-200條數據進行處理。因此當業務量增多,只需要把資金定時服務再部署多一臺服務器即可。
附帶工具
2年前也是在業餘時間,自己基於Visual Studio SDK寫了一個實體成的VS 插件。本工具也是開源的,並很好與Sikiro.Dapper.Extension配合使用,當然也是非必要的可獨立使用。
github地址:https://github.com/SkyChenSky/AutoBuildEntity
其他
如果也想開發類似項目的朋友,也可以參考我以前寫過的三篇文章: