华企号 后端开发 Lambda扩展-Sikiro.Dapper.Extension V2.0

Lambda扩展-Sikiro.Dapper.Extension V2.0

设计理念

该项目主要目的是通过使用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

框架重构

Lambda扩展-Sikiro.Dapper.Extension V2.0插图

框架主要分为两部分:

Sikiro.Dapper.Extension 为公共抽象库,主要是接口、抽象类与公共方法

Sikiro.Dapper.Extension.XXX 为具体实现库,主要是重写不同数据库的特性与语句组合。

Sikiro.Dapper.Extension 类图

Lambda扩展-Sikiro.Dapper.Extension V2.0插图1

Sikiro.Dapper.Extension.MsSql类图

Lambda扩展-Sikiro.Dapper.Extension V2.0插图2

其他特性

链式风格

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

作者: 华企网通王鹏程序员

我是程序员王鹏,热爱互联网软件开发和设计,专注于大数据、数据分析、数据库、php、java、python、scala、k8s、docker等知识总结。 我的座右铭:"业精于勤荒于嬉,行成于思毁于随"
上一篇
下一篇

发表回复

联系我们

联系我们

028-84868647

在线咨询: QQ交谈

邮箱: tech@68v8.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部