开源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操作的,可以在合理的场景下使用异步方法提高应用处理并发能力。支持方法有:
- 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(, );
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()] [Display(Name = "主键")] [Column("SYS_USERID")] [DatabaseGenerated]
高并发处理的UpdateSelect
该方法主要用于把符合条件的数据更新后并查询出来,并通过READPAST过滤了已被锁的数据。具体所生成的SQL语句如下:
UPDATE TOP ( )
SYS_USER WITH ( UPDLOCK, READPAST )
SET USER_STATUS =
OUTPUT INSERTED.[USER_NAME] ,
INSERTED.SYS_USERID ,
INSERTED.EMAIL
FROM SYS_USER
WHERE CREATE_DATETIME < '2018-09-13'
AND USER_STATUS = ;
那么该方法有他的使用场景,在我们公司现有业务,资金定时服务就是通过使用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扩展-Sikiro.Dapper.Extension V2.0的更多相关文章
- 基于Dapper的开源Lambda扩展LnskyDB 2.0已支持多表查询
LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼. 文档地址: https://lining ...
- 基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础介绍
LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼. 文档地址: https://lining ...
- 基于Dapper的开源Lambda扩展LnskyDB 3.0已支持Mysql数据库
LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.,现在已经支持MySql和Sql serv ...
- 封装自己的dapper lambda扩展-设计篇
前言 昨天开源了业务业余时间自己封装的dapper lambda扩展,同时写了篇博文<编写自己的dapper lambda扩展-使用篇>简单的介绍了下其使用,今天将分享下它的设计思路 链式 ...
- 编写自己的dapper lambda扩展-使用篇
前言 这是针对dapper的一个扩展,支持lambda表达式的写法,链式风格让开发者使用起来更加优雅.直观.现在暂时只有MsSql的扩展,也没有实现事务的写法,将会在后续的版本补充. 这是个人业余的开 ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】
前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...
- Dapper的完整扩展(转)
真心想说:其实...我不想用Dapper,如果OrmLite.Net支持参数化的话,也就没Dapper的什么事情了,对于OrmLite.Net只能做后续跟踪...... 这个其实是看了Dapper作者 ...
- 为EasySharding.EFCore提供Dapper相关查询扩展
承接上一篇博文中的中间件基本都是写入性的操作,但对于查询操作实际上是比较鸡肋的,如果单纯的查询,没有分表的情况下基本还能适应,这里为了Dapper提供了扩展 Dapper的扩展查询是需要写表名称的,所 ...
随机推荐
- 产品经理说|AIOps 让告警管理变得更智能
AIOps 人工智能和IT运营支撑 Ops 之间的故事,愈演愈烈,已经成为当今运维圈的热门话题,我打算从2篇文档分享我们在 AIOps 上一些探索和实践.(本篇)为什么事件(告警)处理需要 AIOps ...
- 初学ubuntu之文件权限权限
今天接着做笔记,坚持学习下去. 文件权限修改命令,初学者看见这个命令之后总有些摸不着头脑,这命令里面用到了一些数字,我 自己也是,这次写一篇自己的认识.希望能够帮助到需要学习的人. 首先你可以通过 l ...
- 如何下载 Google Play 应用的apk
Google Play 不能直接下载apk安装包,解决办法,安装插件下载 第一步 FQ就不说了 第二步 安装google浏览器 APK Downloader插件 第三步 打开Google play网站 ...
- python3编写网络爬虫21-scrapy框架的使用
一.scrapy框架的使用 前面我们讲了pyspider 它可以快速的完成爬虫的编写 不过pyspider也有一些缺点 例如可配置化不高 异常处理能力有限对于一些反爬虫程度非常强的网站 爬取显得力不从 ...
- X的平方根的golang实现
实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 输入: 输出: 输入: 输出: 说明: 的 ...
- 【shell脚本】shell脚本实现的 函数差集查找
文本地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. 问题背景 2. 代码实现 1.问题背景 在做公司的测试的自动化测试时,覆盖了一些开发代码的函数,但是那些还没有做,使用一个函 ...
- Zookeeper Health Checks
Short Description: The article talks about the basic health checks to be performed when working on i ...
- 在已经安装的nginx上,增加ssl模块
1. /usr/local/nginx/sbin/nginx -V 查看nginx版本与编译安装了哪些模块nginx version: nginx/1.10.3built by gcc 4.4.7 2 ...
- 使用Docker在本地搭建Hadoop分布式集群
学习Hadoop集群环境搭建是Hadoop入门必经之路.搭建分布式集群通常有两个办法: 要么找多台机器来部署(常常找不到机器) 或者在本地开多个虚拟机(开销很大,对宿主机器性能要求高,光是安装多个虚拟 ...
- 基于位置的服务——百度地图SDK练习
基于位置的服务所围绕的核心就是要先确定出用户所在的位置.通常有两种技术方式可以实现:一种是通过GPS定位,一种是通过网络定位.Android对这两种定位方式都提供了相应的API支持.但由于众所周知的原 ...