前言

  去年我在业余时间,自己整了一套dapper的lambda表达式的封装,原本是作为了一个个人的娱乐项目,当时也只支持了Sql
Server数据库。随之开源后,有不少朋友也对此做了试用,也对我这个项目提出了不少的建议。因此我在最近公司业务不怎么繁忙的情况下,对朋友们的建议和我的想法做了一个总结,然后花了一个星期的时间对项目进行了重构与升级,希望该项目能帮助到有需要的人。

  如果您对它有兴趣,欢迎大家提交Pull
Request代码变更,如果有任何问题可提交issue进行讨论。当然也可以在下方评论和QQ私聊给我。为该文章点个推荐或者给项目点star都是给我最大的动力与支持,谢谢。

源码

https://github.com/SkyChenSky/Sikiro.Dapper.Extension
<https://github.com/SkyChenSky/Sikiro.Dapper.Extension>

文档

具体使用可以查看文档:

https://github.com/SkyChenSky/Sikiro.Dapper.Extension/wiki
<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



其他

  如果也想开发类似项目的朋友,也可以参考我以前写过的三篇文章:

* 封装自己的dapper lambda扩展-设计篇
<https://www.cnblogs.com/skychen1218/p/9234177.html>
* 编写自己的dapper lambda扩展-使用篇
<https://www.cnblogs.com/skychen1218/p/9229669.html>
* 表达式树的解析. <https://www.cnblogs.com/skychen1218/p/5730316.html>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信