前言

  去年我在业余时间,自己整了一套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

框架重构

框架主要分为两部分:

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的更多相关文章

  1. 基于Dapper的开源Lambda扩展LnskyDB 2.0已支持多表查询

    LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼. 文档地址: https://lining ...

  2. 基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础介绍

    LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼. 文档地址: https://lining ...

  3. 基于Dapper的开源Lambda扩展LnskyDB 3.0已支持Mysql数据库

    LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.,现在已经支持MySql和Sql serv ...

  4. 封装自己的dapper lambda扩展-设计篇

    前言 昨天开源了业务业余时间自己封装的dapper lambda扩展,同时写了篇博文<编写自己的dapper lambda扩展-使用篇>简单的介绍了下其使用,今天将分享下它的设计思路 链式 ...

  5. 编写自己的dapper lambda扩展-使用篇

    前言 这是针对dapper的一个扩展,支持lambda表达式的写法,链式风格让开发者使用起来更加优雅.直观.现在暂时只有MsSql的扩展,也没有实现事务的写法,将会在后续的版本补充. 这是个人业余的开 ...

  6. 【转】.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 ...

  7. 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】

    前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...

  8. Dapper的完整扩展(转)

    真心想说:其实...我不想用Dapper,如果OrmLite.Net支持参数化的话,也就没Dapper的什么事情了,对于OrmLite.Net只能做后续跟踪...... 这个其实是看了Dapper作者 ...

  9. 为EasySharding.EFCore提供Dapper相关查询扩展

    承接上一篇博文中的中间件基本都是写入性的操作,但对于查询操作实际上是比较鸡肋的,如果单纯的查询,没有分表的情况下基本还能适应,这里为了Dapper提供了扩展 Dapper的扩展查询是需要写表名称的,所 ...

随机推荐

  1. DOM对象和window对象

    本文内容: DOM对象 Window 对象 首发日期:2018-05-11 DOM对象: DOM对象主要指代网页内的标签[包括整个网页] 比如:document代表整个 HTML 文档,用来访问页面中 ...

  2. html-edm(邮件营销)编写规则

    最近写了一个edm邮件 以前没有接触过  使用的是很老的html页面编写规则  只能用table标签  在此记录一下edm编写的一些规则 个人参考的是这两个网址,转载一下 http://www.zco ...

  3. Jetbrains Idea连接TFS时配置的坑

    #Team Explorer Everywherehttps://www.microsoft.com/en-us/search/result.aspx?q=team+explorer+everywhe ...

  4. Django JsonResponse与HttpResponse重要区别

    JsonResponse是HttpResponse的一个子类,是Django提供的用于创建JSON编码类型响应的快捷类.它的默认Content-Type头部设置为application/json,它的 ...

  5. Spring MVC Spring中的Model (五)

    完整的项目案例: springmvc.zip 目录 实例 项目结构: 配置web.xml <?xml version="1.0" encoding="UTF-8&q ...

  6. Windows四大傻X功能——那些拖慢系统性能的罪魁祸首

    最近新装了一个PC,配置还算蛮高,i7的CPU,8G内存,2T的硬盘,于是小心翼翼地装了一个干净的正版Win7,但是发现居然开机明显卡?所以做了些研究,发现即使全新安装的正版windows,居然也有些 ...

  7. 服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)

    1. 3种系统架构与2种存储器共享方式 1.1 架构概述 从系统架构来看,目前的商用服务器大体可以分为三类 对称多处理器结构(SMP:Symmetric Multi-Processor) 非一致存储访 ...

  8. CMM/CMMI的基本概念

    "CMM是指“能力成熟度模型”,其英文全称为Capability Maturity Model for Software,英文缩写为SW-CMM,简称CMM. 它是对于软件组织在定义.实施. ...

  9. 归并排序python实现

    归并排序python实现 归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 原序先通过一半一半的拆分,然后: 然后再一步一步的向上合并,在合并的过 ...

  10. CSS3的新特性整理

    animation    IE10 animation的六大属性 animation-name规定需要绑定选择器的keyframe名称 animation-duration规定完成动画所花费的时间 s ...