微型 ORM 的第一篇 DapperLambda发布

引言:因为接触过多个ORM,但使用的时候都遇到了各自的一些不够理想的地方,从最早开始开始公司自己分装的,到后面用EF,以及Dapper和DapperExtensions  到现在用的FluentData,就说说我自己的使用体验,在这几个相比之下,Dapper应该是最轻量级,而且性能也是最好的,但是相对比较简单了点。EF的最新版也没去使用,所以现在不是很了解,EF在这几个相比一下,功能是最强大的,但是启动加载慢,以及复杂的功能,后续人优化麻烦。FluentData 怎么说呢,用的都挺好用,而且语法是最容易让人理解,但是还是不支持Lambda。基于以上这些,所以萌生了我自己动手做一个ORM,性能能跟Dapper比肩,语法要简单,容易理解,所以很多地方借鉴了FluentData ,但是内部的逻辑是完全不一样的。

总的来讲的话, DapperLambda 就是Dapper和DapperExtensions的二次分装,使用语法和FluentData基本类似,并加上了Lambda.原则:封装和丰富这些功能不是为了不写SQL,而是做到简单的SQL,不希望在开发中重复写。。。

下面我将介绍在开发过程中的运用.

一:下载该项目并且引用DapperLambda.dll,在VS的命令窗口中执行  Install-Package DapperLambda

或是 在引用->管理NuGet程序包中搜索 DapperLambda

二.dll引用入到我们的数据业务层.

1.)创建并且初始化一个DbContext.

它是我们与数据库操作中的上下文,所有的有关数据操作都调用它下面的方法;目前只针对MSSQL进行了单元测试,后续会继续完善在其他数据库中使用,所以非MSSQL,使用请谨慎

1     public static DbContext GetContext()
2         {
3             string connectionStr = "server=(local);User ID=sa;Password=password01!;Database=LocalDB;Persist Security Info=True;Pooling=true;Max Pool Size=700";
4             return new DbContext().ConnectionString(connectionStr, DatabaseType.MSSQLServer);
5         }

2.)接下来就正式开始介绍DapperLambda的语法,因为部分语法都一致,所以在第一篇就不介绍了,后续都有详细介绍,就挑几个不一样的了解一下

  1. 支持Lamba设置条件和排序 ,最终会得到一个SQL,(关于如果监控执行过程,后续会介绍) 执行返回得到IEnumerable<T>
1   [TestMethod]
2         public void TestOrderByMethod()
3         {
4             using (var context = DBHelper.GetContext())
5             {
6                 var ls = context.Select<Application>().Where(p => p.CategoryID == 1).OrderBy(p => p.ApplicationID).QueryMany();
7                 Assert.IsTrue(ls.Count() > 0);
8             }
9         }

直接上图吧,最直接

当然在这条件和排序都是可以进行多次组合如下:

1   [TestMethod]
2         public void TestConditionMethod()
3         {
4             using (var context = DBHelper.GetContext())
5             {
6                 var ls = context.Select<Application>().Where(p => p.ApplicationID == 1000 || p.CategoryID == 1).And(c => c.Owner == "CNLIFAN").OrderBy(p => p.ApplicationID).QueryMany();
7                 Assert.IsTrue(ls.Count() > 0);
8             }
9         }

2.Lambda指定条件、动态指定更新的字段,以防更新额外字段

1  public void UpdateMethod()
2         {
3             using (var context = DBHelper.GetContext())
4             {
5                 var item = context.Update<MobileForTest>().Set(new { MobileHolder = "TEST-10", MobilePhone = "18923456789" }).Where(p => p.ID == 1).Execute();
6                 Assert.IsTrue(item > 0);
7             }
8         }

3.查询语句嵌套,最终合并成一个大的SQL执行

1   public void Delete3Method()
2         {
3             using (var context = DBHelper.GetContext())
4             {
5                 var item = context.Delete<MobileForTest>().WhereIsIn(p => p.ID, context.Select<Application>(p => p.ApplicationID == 10001).Select(p => p.CategoryID)).Execute();
6                 Assert.IsTrue(item > 0);
7             }
8         }
1    [TestMethod]
2         public void SQLMethod13()
3         {
4             using (var context = DBHelper.GetContext())
5             {
6                 var item = context.Select<MobileForTest>().WhereNotIn(p => p.ID, context.Select<Application>(p => p.ApplicationID == 10001).Select(p => p.CategoryID)).QuerySingle();
7                 Assert.IsTrue(item.ID == 1);
8             }
9         }
1   [TestMethod]
2         public void SQLMethod14()
3         {
4             using (var context = DBHelper.GetContext())
5             {
6                 var curID = context.Select<MobileForTest>(p => p.ID == 1).Select(item => new { ID = item.ID, Mobile = item.MobilePhone }).QueryDynamicSingle();
7                 var pkID = curID;
8             }
9         }

灵活指定返回想要的字段

4.方便的使用事物

 1  [TestMethod]
 2         public void UseTransactionMethod()
 3         {
 4             var pkid = 1;
 5             var model = new MobileForTest { MobileHolder = "TEST-linfengFang", MobilePhone = "18911112222", Status = 0 };
 6             using (var context = DBHelper.GetContext().UseTransaction(true))
 7             {
 8                 context.Insert<MobileForTest>(model).Execute();
 9                 var item = context.Sql("UPDATE MobileForTest SET MobileHolder = ‘SQLMethod-linfeng‘ WHERE [email protected]", new { ID = pkid }).Execute();
10                 context.Commit();
11             }
12         }

5.在项目中更加使用的分页功能

 1    [TestMethod]
 2         public void SQLPage()
 3         {
 4             var record = 0;
 5             using (var context = DBHelper.GetContext())
 6             {
 7                 var pageIndex = 0;
 8                 var pageSize = 3;
 9                 context.Select<MobileForTest>(p => p.MobilePhone == "18911112222" && p.ID != 1).QueryPage(pageIndex, pageSize, out record);
10                 Assert.IsTrue(record > 0);
11             }
12         }
13         [TestMethod]
14         public void SQLPage2()
15         {
16             var record = 0;
17             using (var context = DBHelper.GetContext())
18             {
19                 var pageIndex = 0;
20                 var pageSize = 3;
21                 var ls = context.Sql("select * from MobileForTest").QueryPage<MobileForTest>(pageIndex, pageSize, out record);
22                 Assert.IsTrue(record > 0);
23             }
24         }

相对其他的ORM,做了以上的封装,还有大部分基本的功能与其他的语法,也比较类似,所以开篇没提到,目前都已经支持了。欢迎大家任意使用,如果有遇到问题,都可以给我留言,

代码在后续会版本稳定和代码规整后,会考虑进行开源。

时间: 2024-08-25 12:33:44

微型 ORM 的第一篇 DapperLambda发布的相关文章

轻量级ORM框架——第一篇:Dapper快速学习

我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为the king of ORM. 一:为什么选择Dapper 1. 性能优越: 其实在各大网站上,我们大概都会看到这样的一个对比效果图,在超过500次poco serialization的过程中所表现的性能,我们发现dapper是第二名, 当然第一名谁也无法超越,越底层的当然久越快,同时也就越麻烦.就好

第一篇使用windows live writer发布日志

测试一下使用windows live writer发布日志. 第一篇使用windows live writer发布日志,布布扣,bubuko.com

第一篇 SQL Server安全概述

本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文. 面对当今复杂的攻击SQL Server有你需要的一切来保护你的服务器和数据.但在你能有效地使用这些安全功能之前,你需要了解你所面临的威胁和一些基本的安全概念.本系列的第一篇将讲解基础知识,可以充分利用SQL Server中的安全功能而不是浪费时间在不能保护你的数据被威胁的功能上.Relational databases are used in an amazing variety of applications with co

秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. ----------------------

前端学HTTP之报文系列第一篇——起始行

前面的话 如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了.HTTP报文是在HTTP应用程序之间发送的简单的格式化数据块,每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应.它们由三个部分组成:由起始行.首部和实体的主体部分.本文是HTTP报文系列第一篇——起始行 报文语法 所有的HTTP报文都可以分为两类:请求报文(request message)和响应报文(response message).请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客

视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时间录制,今天我兑现了给朋友们的承诺.. 本次视频教程的目录为 视频.代码.资料,其中视频有4段,资料是我收集的相关资料.. 视频下载地址:http://pan.baidu.com/s/1c05sysC 希望大家多多支持... 郝喜路 2014年6月8日 11:11:02   http://haoxilu.cn

秒杀多线程第一篇 多线程笔试面试题汇总

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. -------------------------------------华丽的分割线

第一篇 Replication:复制简介

本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文. 复制这个词来自拉丁语中的"replicare",意味着重复.Replication describes the process of reproducing or duplicating.Replication in SQL Server does exactly that;it reproduces or duplicates data.任何时候,你需要创建一个数据的副本,或重现该数据的变化,复

2015元旦第一篇博文:Red5流媒体服务器搭建

今天是2015年的第一天,白天陪老婆孩子去BHG(华联)转了转,中午在九毛九吃了顿午饭,就这样过了元旦,虽然有点累,但是挺开心,北京今天的天气也比较给力,风和日丽,没有雾霾!现在是晚上十点,因为白天出去玩,老婆孩子有点累,现在已经熟睡,我不想就这样就结束2015的第一天,作为一个新的开始,我决定写2015年的第一篇博文.闲话少说,进入主题.流媒体这个概念在第一家公司就了解了,当时做一个Eleaning在线教育平台的时候,用Red5流媒体服务器技术,支持过视频模块的播放.下面就谈谈我对流媒体的认识