歡迎光臨
每天分享高質量文章

開源Dapper的Lambda擴展-Sikiro.Dapper.Extension V2.0

 去年我在業餘時間,自己整了一套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操作的,可以在合理的場景下使用異步方法提高應用處理併發能力。支持方法有:

  1. ToListAsync
  2. GetAsync
  3. InsertAsync
  4. DeleteAsync
  5. UpdateSelectAsync
  6. UpdateAsync

框架重構

框架主要分為兩部分:

Sikiro.Dapper.Extension 為公共抽象庫,主要是接口、抽象類與公共方法

Sikiro.Dapper.Extension.XXX 為具體實現庫,主要是重寫不同資料庫的特性與陳述句組合。

Sikiro.Dapper.Extension 類圖

Sikiro.Dapper.Extension.MsSql類圖

鏈式風格

Query

con.QuerySet().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().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

  如果也想開發類似專案的朋友,也可以參考我以前寫過的三篇文章:

  • 封裝自己的dapper lambda擴展-設計篇
  • 編寫自己的dapper lambda擴展-使用篇
  • 運算式樹的解析.

原文鏈接:https://www.cnblogs.com/skychen1218/p/10600424.html

赞(0)

分享創造快樂