- 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 == "287245177@qq.com")
- .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 == "287245177@qq.com").Update(a => new SysUser { Email = "123456789@qq.com" });
忠于原生的特性标签
不标新立异, 方便替换组件
- [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