开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0

简介: 开源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


框架重构


image.png


框架主要分为两部分:


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


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


Sikiro.Dapper.Extension 类图


image.png


Sikiro.Dapper.Extension.MsSql类图


image.png


其他特性


链式风格


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


488722-20190326162836718-1899628585.gif



其他

  

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

目录
相关文章
|
开发工具 Android开发
uniapp调用芯烨xprinter打印机安卓sdk
uniapp调用芯烨xprinter打印机安卓sdk
728 0
|
SQL 开发框架 关系型数据库
值得推荐的.NET ORM框架
值得推荐的.NET ORM框架
382 0
|
前端开发 Linux C#
一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia
一款开源、免费、美观的 Avalonia UI 原生控件库 - Semi Avalonia
1394 10
Vue3开关(Switch)
这是一个可高度定制的开关组件,支持设置选中与未选中时的内容、值、大小、加载状态、禁用状态及点击波纹颜色等属性。组件提供了多种尺寸选择,并允许自定义图标与样式,适用于多种场景下的开关功能实现。[在线预览](https://themusecatcher.github.io/vue-amazing-ui/guide/components/switch.html)展示了其丰富的配置选项和实际效果。
415 4
Vue3开关(Switch)
|
算法 JavaScript 前端开发
JavaScript学习 -- SM4算法应用实例
JavaScript学习 -- SM4算法应用实例
1051 0
|
存储 NoSQL API
.NET NoSQL 嵌入式数据库 LiteDB 使用教程
.NET NoSQL 嵌入式数据库 LiteDB 使用教程~
645 0
|
数据可视化 安全 Android开发
低代码可视化-uniapp蓝牙标签打印-代码生成器
低代码可视化-uniapp蓝牙标签打印-代码生成器
691 0
|
SQL 开发框架 .NET
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
4499 0
|
负载均衡 安全 网络安全
SD-WAN是否将终结IPsec VPN?
在网络架构的演进历程中,IPsec VPN一直扮演着至关重要的技术角色。而近年来备受关注的SD-WAN技术日益成熟,各大服务供应商纷纷将其与IPsec VPN进行对比,似乎预示着SD-WAN必然替代传统的IPsec VPN。 然而事实究竟如何?SD-WAN等于IPsec VPN的替代吗?经过几年的发展,我们对这个技术变革的实际影响也有了更为清晰的认识。
SD-WAN是否将终结IPsec VPN?
|
JavaScript 前端开发 小程序
uniapp中nvue页面如何全屏,map组件如何全屏?
uniapp中nvue页面如何全屏,map组件如何全屏?
1048 3