搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】
前言
继之前发的帖子【ORM-Dapper+DapperExtensions】,对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持。
由于之前缺乏对Lambda的知识,还是使用了拿来主义。研究了些案例,总归有些问题:
1、只能生成sql、不能将值进行参数化。
2、lambda解析的代码对sql语法的多样式支持不够
3、不开源,反编译后发现可扩展性不强。
最后选择了Dos.ORM(lambda支持的很好,开源的),在这里尊重原创,大家有兴趣去支持下哈。
【作者博客:http://www.cnblogs.com/huxj/ 官方网站:http://ITdos.com/Dos/ORM/Index.html 】
开始研究Dos.ORM , 最后还是要是使用 Dapper 的, 同时还要基于 DapperExtensions的设计思想。
目的是把Dos.ORm的lambda解析核心代码借鉴过来,然后用Dapper去执行。
想法不错,但是实现起来废了一番周折。
大概改动如下:
1、在DapperExtensions原有接口中扩展lambda方法
2、基于DapperExtensions的缓存机制 ,替换了Dos.ORM 对各个字段的和表结构的映射方式。
3、沿用DapperExtensions 中的定义方言接口进行生成sql的扩展
4、扩展了若干方法, 同时去除了Dos.ORM的一些特性.
这里必须要维护DapperExtensions 对实体类的0入侵的原则。
最后发现想让ORM支持Lambda 的语法更多,最后还是要去扩展实体类。(各有利弊得失……)
语法
这里还是直接贴代码了,为了照顾对dapper不熟悉的同学,下面将dapper、DapperExtensions、DapperExtensions+lambda 的语法分块贴出来。
1、实体类
/// <summary>
/// HY:实体对象
/// </summary>
[Serializable]
public class UsersEntity
{
/// <summary>
/// 用户ID
/// </summary>
public int UserId { get; set; } /// <summary>
/// 登录名称
/// </summary>
public string LoginName { get; set; } /// <summary>
/// 密码
/// </summary>
public string Password { get; set; } /// <summary>
/// 状态 1:启用 0禁用
/// </summary>
public int? Status { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateTime { get; set; } /// <summary>
/// 更新时间
/// </summary>
public DateTime? UpdateTime { get; set; } /// <summary>
/// 备注
/// </summary>
public string Remark { get; set; } } /// <summary>
/// Users:实体对象映射关系
/// </summary>
[Serializable]
public class UsersEntityORMMapper : ClassMapper<UsersEntity>
{
public UsersEntityORMMapper()
{
base.Table("Users");
//Map(f => f.UserInfo).Ignore();//设置忽略
//Map(f => f.Name).Key(KeyType.Identity);//设置主键 (如果主键名称不包含字母“ID”,请设置)
AutoMap();
}
}
2、原生态的Dapper
//做为Demo以下语法的支持, 声明的一个变量
IDbConnection connDemo = this.DBSession.Connection; IEnumerable<UsersEntity> listDemo = connDemo.Query<UsersEntity>("SELECT * FROM Users AS u "); IEnumerable<UsersEntity> listDemo1 = connDemo.Query<UsersEntity>("SELECT * FROM Users AS u WHERE u.UserId=@UserId AND u.LoginName LIKE @LoginName", new { UserId = 11, LoginName = "%王老五%" }); IEnumerable<UsersEntity> listDemo2 = connDemo.Query<UsersEntity>("SELECT * FROM Users AS u WHERE u.UserId IN @UserIds ", new { UserIds = new int[] { 1, 2, 3 }.AsEnumerable() }); string sqlDemo = @"SELECT * FROM Users AS u
LEFT JOIN UserInfo AS ui
ON u.UserId = ui.UserId";
IEnumerable<UsersModel> listDemo3 = connDemo.Query<UsersModel, UserInfoEntity, UsersModel>(sqlDemo, (user, userinfo) => { user.UserInfo = userinfo; return user; }).ToList(); string sqlDemo1 = @"SELECT * FROM Users AS u WHERE u.UserId=@UserId
SELECT * FROM UserInfo AS ui WHERE ui.UserId=@UserId";
using (var multi = connDemo.QueryMultiple(sqlDemo1, new { UserId = 1 }))
{
var user = multi.Read<UsersEntity>().Single();
var userinfo = multi.Read<UserInfoEntity>().Single();
} connDemo.Execute("sql 语句"); //存储过程
var UsersEntity = connDemo.Query<UsersEntity>("spGetUser", new { Id = 1 }, commandType: CommandType.StoredProcedure).SingleOrDefault();
2、DapperExtensions
//实体类
UsersEntity entity = new UsersEntity(); int userId = this.Insert(entity);//插入 bool isSuccess = this.Update(entity);//更新 int count = this.Delete(entity);//删除 entity = this.GetById(1);//获得实体 int count1 = this.Count(new { ID = 1 }); //数量 //查询所有
IEnumerable<UsersEntity> list = this.GetAll(); //条件查询
IList<ISort> sort = new List<ISort>();
sort.Add(new Sort { PropertyName = "UserId", Ascending = false });
IEnumerable<UsersEntity> list1 = this.GetList(new { UserId = 1, Name = "123" }, sort); //orm 拼接条件 查询 繁琐 不灵活 不太好用
IList<IPredicate> predList = new List<IPredicate>();
predList.Add(Predicates.Field<UsersEntity>(p => p.LoginName, Operator.Like, "不知道%"));
predList.Add(Predicates.Field<UsersEntity>(p => p.UserId, Operator.Eq, 1));
IPredicateGroup predGroup = Predicates.Group(GroupOperator.And, predList.ToArray());
list = this.GetList(predGroup); //分页查询
long allRowsCount = 0;
this.GetPageList(1, 10, out allRowsCount, new { ID = 1 }, sort);
3、DapperExtensions+lambda
//SELECT [Users].[UserId],
// [Users].[LoginName],
// [Users].[Password]
//FROM [Users]
//WHERE [Users].[LoginName] = @LoginName_1
var fromDemo = this.LambdaQuery().Select(p => new { p.UserId, p.LoginName, p.Password }) //不支持As
.Where(p => p.LoginName == "很好很强大"); //支持 返回 DataReader、DataSet、DataTable、 泛型集合
fromDemo.ToDataReader();
fromDemo.ToDataSet();
fromDemo.ToDataTable();
IEnumerable<UsersModel> list = fromDemo.ToList<UsersModel>(); var select = new Select<UsersEntity>();
select.AddSelect(p => p.Remark.As("Remark")); //Expression<Func<T, bool>>类型支持 as 语法
fromDemo = this.LambdaQuery().AddSelect(select); // SELECT [Users].[UserId],
// [Users].[LoginName],
// [Users].[Password],
// [Users].[Status],
// [Users].[CreateTime],
// [Users].[UpdateTime],
// [Users].[Remark]
//FROM [Users]
//WHERE (
// (
// ([Users].[LoginName] LIKE @LoginName_1)
// AND ([Users].[Status] NOT IN (@Status_2, @Status_3, @Status_4))
// )
// AND ([Users].[CreateTime] >= @CreateTime_5)
// )
// AND ([Users].[UpdateTime] IS NOT NULL)
var fromDemo2 = this.LambdaQuery().Where(p => p.LoginName.Like("%王老五%") //like
&& p.Status.NotIn<string>("1", "2", "3") //in or not in
&& p.CreateTime >= Convert.ToDateTime("2016-01-21") //时间比较
&& p.UpdateTime.IsNotNull() //is null
); //SELECT [Users].[UserId],
// [Users].[LoginName],
// [Users].[Password],
// [Users].[Status],
// [Users].[CreateTime],
// [Users].[UpdateTime],
// [Users].[Remark]
//FROM [Users]
//WHERE (
// (
// ([Users].[LoginName] LIKE @LoginName_1)
// AND ([Users].[Status] = @Status_2)
// )
// OR ([Users].[UserId] = @UserId_3)
// )
var where = new Where<UsersEntity>();
where.And(p => p.LoginName.Like("%李二蛋%") && p.Status == 1);
where.Or(p => p.UserId == 1);
var fromDemo3 = this.LambdaQuery().Where(where); //SELECT [Users].[UserId],
// [Users].[LoginName],
// [Users].[Password],
// [Users].[Status],
// [Users].[CreateTime],
// [Users].[UpdateTime],
// [Users].[Remark]
//FROM [Users]
//ORDER BY
// CreateTime ASC,
// UpdateTime ASC,
// UserId DESC
var fromDemo4 = this.LambdaQuery().OrderBy(p => new { p.CreateTime, p.UpdateTime }).AddOrderByDescending(p => new { p.UserId }); //"SELECT * FROM [Users] INNER JOIN UserInfo ON ([Users].[UserId] = [UserInfo].[UserId]) "
var fromDemo5 = this.LambdaQuery().InnerJoin<UserInfoEntity>((u, ui) => u.UserId == ui.UserId); //SELECT DISTINCT TOP 100 *
//FROM [Users] WITH (NOLOCK) INNER
// JOIN UserInfo WITH (NOLOCK)
// ON ([Users].[UserId] = [UserInfo].[UserId])
var fromDemo6 = this.LambdaQuery()
.InnerJoin<UserInfoEntity>((u, ui) => u.UserId == ui.UserId).WithNoLock().Top(100).Distinct(); //SELECT TOP(10) [_proj].*
//FROM (
// SELECT ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) AS [_row_number],
// *
// FROM [Users] WITH (NOLOCK) LEFT
// JOIN UserInfo WITH (NOLOCK)
// ON ([Users].[UserId] = [UserInfo].[UserId])
// WHERE ([Users].[UserId] > @UserId_1)
// AND ([UserInfo].[Sex] = @Sex_2)
// ) [_proj]
//WHERE [_proj].[_row_number] >= @_pageStartRow
//ORDER BY
// [_proj].[_row_number]
var fromDemo7 = this.LambdaQuery()
.LeftJoin<UserInfoEntity>((u, ui) => u.UserId == ui.UserId).WithNoLock()
.Where<UserInfoEntity>((u, ui) => u.UserId > 1 && ui.Sex == 1)
.Page(2, 10); //DELETE
//FROM [Users]
//WHERE ([Users].[Status] = @Status_1)
// AND (
//[Users].[CreateTime] > @CreateTime_2
var deleteDemo = this.LambdaDelete()
.Where(p => p.Status == 1 && p.CreateTime > DateTime.Now); //UPDATE [Users]
//SET [Users].[Remark] = @Remark_3
//WHERE [Users].[Status] = @Status_4
var updateDemo = this.LambdaUpdate()
.Set(p => p.Remark == "Remark")
.Where(p => p.Status == 1);
对于lambda 支持 select + As 、where 、各种左右连接、 orderby 、grouy by、 HAVING、 WITH(NOLOCK) (支持sqlserver)、 Top、Distinct、
(支持sql垮数据库查询,加入DbName、SchemaName配置)
简单的语法都支持了,但是还有些特殊的sql 语法 介于Lambda的语法问题暂时没办法支持。不过Dos.ORM做到了一些特殊的支持。
之前也和Dos.ORM的作者交流过。 目前都不支持 select * from User a INNER join User b on a.id=b.pid 这类 别名且自join查询,实现起来很麻烦。
这里我就放弃了,有些功能在考虑到性能和设计方面得不偿失。
比如一个特别复杂的sql ,非要用ORM来实现,那其实已经超出ORM的能力范围了。且不论性能问题和代码支持问题, 单单代码可读性就降低很多啊
相信直接看sql 比直接看 orm语法 看的爽吧 。
性能:
用lambda生成sql用时也就2,3 毫秒的样子, 所以在执行和映射能力方面我就不担心了。最后还是写了个小测试:
aaarticlea/png;base64,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" alt="" />
之前有很多小伙伴不太了解如何使用或者调用, 这里简单的写个Demo, (下载地址在下面 )
1.针对Repository的类图如下:
aaarticlea/png;base64,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" alt="" />
2、Demo的 架构如下:
aaarticlea/png;base64,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XkK6lnuyjw5ef3Ds9W/+bsmDEAiL1SURVheUZW0Ttf69efVHw98+lrCp8u5NlfcQEjUbKhLe2n9/4+XTljwCgUhYXRJhdUFZljfRifrdb+0f9vaxhI0VQzZW3E1I5AxZXzH4rY/vK/10o1UPPyASVpdEWF1Qlh1N5Knbvvqj4WuPDNpYkbih4q6NhIRJwrqywWv2j2ByQQxWl0RYXVCWTU3U+vfmLUemvPXxfWsOD9pQkbChInFDReJGone8D4MNxxOzSwev/njIuv0Pnf+y2toHHhAJq0sirC4oy9Ym+uTzne+W/XpZ0U8JCczGkvHln7n49nmIxOqSCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvK8jcRIYTokHiXLqJjdUFZk5YfjHsJEkKIsMS7dBEdqwvK2nHkXNxLkBBCxGR9cU28SxfRsboAAABEYHUBAACIwOoCAAAQgdUFAAAgAqsLAABABFYXAACACKwuAAAAEVhdAAAAIrC6AAAARGB1AQAAiMDqAgAAEIHVBQAAIAKrCwAAQARWFwAAgAisLgAAABFYXQAAACKwugAAAERgdQEAAIjA6gIAABCB1QUAACACqwsAAEAEVhcAAIAIrC4AAAARWF0AAAAisLoAAABEYHUBAACIwOoCAAAQgdUFAAAgAqsLAABABFYXAACACKwuAAAAEVhdAAAAIrC6AAAARGB1AQAAiMDqAgAAEIHVBQAAIAKr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Ih+iUA+rSyKsLigrXk20oXTDbYtucyxyOF6+wfHKfyEkTF6+wZHu6Jvel8mFnmN1SYTVBWXFsYkaLjfc++a9Ny+62bHI4XjZ4Xj5BkLa4nAsdnznxe/0f6V/aW2p+Acn1MPqkgirC8qKexPlleWNWjPKMddBSGDuXHbnGx+/wbfPwypx7zp0HasLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvKookA6ICukwirC8qiiQDogK6TCKsLyqKJAOiArpMIqwvK8jcRIYTokHiXLqJjdUFZk5YfjHsJEkKIsMS7dBEdqwvK2nHkXNxLkBBCxGR9cU28SxfRsboAAABEYHUBAACIwOoCAAAQgdUFAAAgAqsLAABABFYXAACACKwuAAAAEVhdAAAAIrC6AAAARGB1AQAAiMDqAgAAEIHVBQAAIAKrCwAAQARWFwAAgAisLgAAABFYXQAAACKwugAAAERgdQEAAIjA6gIAABCB1QUAACACqwsAAEAEVhcAAIAIrC4AAAARWF0AAAAisLoAAABEYHUBAACIwOoCAAAQgdUFAAAgAqsLAABABFYXAACACKwuAAAAEVhdAAAAIrC6AAAARGB1AQAAiMDqAgAAEIHVBQAAIAKrCwAAQIT/D2T5nGtn4h/OAAAAAElFTkSuQmCC" alt="" />
欢迎老大们拍砖指点。
觉得有用请点下推荐吧,你的推荐是我发帖的动力。
https://git.oschina.net/hy59005271/DapperExtensions_Demo
有新的扩展和bug会及时更新
相关文章:
搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
原文链接:http://www.cnblogs.com/hy59005271/p/5604118.html
搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】的更多相关文章
- 搭建一套自己实用的.net架构(3)【ORM-Dapper+DapperExtensions】
现在成熟的ORM比比皆是,这里只介绍Dapper的使用(最起码我在使用它,已经运用到项目中,小伙伴们反馈还可以). 优点: 1.开源.轻量.小巧.上手容易. 2.支持的数据库还蛮多的, Mysql,S ...
- 搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】
工欲善其事必先利其器, 下面来说说代码生成器. 现在代码生成器品种繁多各式各样, 什么codesmith.T4. 动软也算.那么每款代码生成器都有自己模板解析引擎. 现在比较流行的 NVelocit ...
- 搭建一套自己实用的.net架构(2)【日志模块-log4net】
先谈谈简单的模块,日志.在系统中日志模块是必须的,什么系统日志,操作日志,调试日志.这里用的是log4net. 对log4net还不熟悉的小伙伴们赶快去搜索基础教程哦, 我这里就不温故了. 那么有人要 ...
- 搭建一套自己实用的.net架构(1)【概述】
入园很久,一直默默的潜水,近来得空想写点什么. 思前想后,那就把自己平时没事干自己摘抄.引用.瞎写的一些东西写出来.帮助自己巩固一下,顺便请高手们指点一二. 我本人很懒 ,一些代码就是直接复制别人的劳 ...
- 基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【六】【引入bootstrap前端框架】
https://blog.csdn.net/linzhefeng89/article/details/78752658 基于springboot+bootstrap+mysql+redis搭建一套完整 ...
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...
- 搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目
前言 伴随着随着微服务概念的不断盛行,与之对应的各种解决方案也层出不穷.这毕竟是一个信息大爆发的时代,各种编程语言大行其道,各有各的优势.但是有一点未曾改变,那就是他们服务的方式,工作的时候各 ...
- 从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社
从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社 PPT链接: https://pan.baidu.com/s/1i5Jrr1N 视频链接: https: ...
- 基于 Express+Gulp+BrowserSync 搭建一套高性能的前端开发环境
基于 Express+Gulp+BrowserSync 搭建一套高性能的前端开发环境 Express 是比较经典的,也是最常用的 Nodejs Web框架. 一.Express 快速构建一个web应用 ...
随机推荐
- Storm如何保证可靠的消息处理
作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文主要翻译自Storm官方文档Guaranteeing messag ...
- JS正则表达式常用总结
正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...
- 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper
剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...
- django server之间通过remote user 相互调用
首先,场景是这样的:存在两个django web应用,并且两个应用存在一定的联系.某些情况下彼此需要获取对方的数据. 但是我们的应用肯经都会有对应的鉴权机制.不会让人家随随便便就访问的对吧.好比上车要 ...
- 一步一步教你用CSS画爱心
今天小颖给大家分享一个用CSS画的爱心,底下有代码和制作过程,希望对大家有所帮助. 第一步: 先画一个正方形.如图: <!DOCTYPE html> <html> <he ...
- 谈谈一些有趣的CSS题目(六)-- 全兼容的多列均匀布局问题
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- SVD奇异值分解的基本原理和运用
SVD奇异值分解: SVD是一种可靠的正交矩阵分解法.可以把A矩阵分解成U,∑,VT三个矩阵相乘的形式.(Svd(A)=[U*∑*VT],A不必是方阵,U,VT必定是正交阵,S是对角阵<以奇异值 ...
- AutoMapper的介绍与使用(一)
软件环境 vs2015 asp.net mvc 5 .NET Framework 4.5.2 AutoMapper 5.2.0.0 AutoMapper安装 新建asp.net mvc 项目 Auto ...
- 创建ABPboilerplate模版项目
本文是根据角落的白板报的<通过ABPboilerplate模版创建项目>一文的学习总结,感谢原文作者角落的白板报. 1 准备 开发环境: Visual Studio 2015 update ...
- ADFS3.0与SharePoint2013安装配置(原创)
现在越来越多的企业使用ADFS作为单点登录,我希望今天的内容能帮助大家了解如何配置ADFS和SharePoint 2013.安装配置SharePoint2013这块就不做具体描述了,今天主要讲一下怎么 ...