引言:因为接触过多个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,使用请谨慎

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

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

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

直接上图吧,最直接

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

   [TestMethod]
public void TestConditionMethod()
{
using (var context = DBHelper.GetContext())
{
var ls = context.Select<Application>().Where(p => p.ApplicationID == || p.CategoryID == ).And(c => c.Owner == "CNLIFAN").OrderBy(p => p.ApplicationID).QueryMany();
Assert.IsTrue(ls.Count() > );
}
}

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

  public void UpdateMethod()
{
using (var context = DBHelper.GetContext())
{
var item = context.Update<MobileForTest>().Set(new { MobileHolder = "TEST-10", MobilePhone = "" }).Where(p => p.ID == ).Execute();
Assert.IsTrue(item > );
}
}

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

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

灵活指定返回想要的字段

4.方便的使用事物

  [TestMethod]
public void UseTransactionMethod()
{
var pkid = ;
var model = new MobileForTest { MobileHolder = "TEST-linfengFang", MobilePhone = "", Status = };
using (var context = DBHelper.GetContext().UseTransaction(true))
{
context.Insert<MobileForTest>(model).Execute();
var item = context.Sql("UPDATE MobileForTest SET MobileHolder = 'SQLMethod-linfeng' WHERE ID=@ID", new { ID = pkid }).Execute();
context.Commit();
}
}

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

    [TestMethod]
public void SQLPage()
{
var record = ;
using (var context = DBHelper.GetContext())
{
var pageIndex = ;
var pageSize = ;
context.Select<MobileForTest>(p => p.MobilePhone == "" && p.ID != ).QueryPage(pageIndex, pageSize, out record);
Assert.IsTrue(record > );
}
}
[TestMethod]
public void SQLPage2()
{
var record = ;
using (var context = DBHelper.GetContext())
{
var pageIndex = ;
var pageSize = ;
var ls = context.Sql("select * from MobileForTest").QueryPage<MobileForTest>(pageIndex, pageSize, out record);
Assert.IsTrue(record > );
}
}

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

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

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

  1. 微型 ORM 的第二篇 DapperLambda性能测试[Dapper比较篇]

    由于这周比较忙,所以本来想做的性能测试,一直没时间,想想还是今天给补上吧 由于很多人都担心性能问题,封装之后跟Dapper的性能差距是多少,今天我给出我的测试方法,仅供参考. 创建IDbConnect ...

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

    我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...

  3. “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第一篇

    一.第一篇内容中必须得简单的介绍一下MVC(在大学时用的是WebForm,拖控件感觉很爽,但是工作后,技术总监让一定要放弃这种 想法!) 1.MVC是什么?:(1) ASP.NET MVC是微软官方提 ...

  4. VSCode上发布第一篇博客

    在VSCode上发布到博客园的第一篇博客 前段时间在VSCode安装好插件WriteCnblog,多次检查writeCnblog configuration配置信息也是完全正确的,但是一直没能在VSC ...

  5. 使用cnblogs发布第一篇文章,HelloWorld

    HelloWorld! 瞅瞅源码的样式,嗯,语法高亮还是可以的,辨识度还是挺高的. <!DOCTYPE html> <html> <head> <meta c ...

  6. DapperLambda发布

    DapperLambda发布 引言:因为接触过多个ORM,但使用的时候都遇到了各自的一些不够理想的地方,从最早开始开始公司自己分装的,到后面用EF,以及Dapper和DapperExtensions ...

  7. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  8. FluentData微型ORM

    最近在帮朋友做一个简单管理系统,因为笔者够懒,但是使用过的NHibernate用来做这中项目又太不实际了,索性百度了微型ORM,FluentData是第一个跳入我眼睛的词.简单的了解下FluentDa ...

  9. 深入理解ajax系列第一篇——XHR对象

    × 目录 [1]创建对象 [2]发送请求 [3]接收响应[4]异步处理[5]实例演示 前面的话 ajax是asynchronous javascript and XML的简写,中文翻译是异步的java ...

随机推荐

  1. oracle任务计划debug

    crontab -eno crontab for root - using an empty onecrontab: installing new crontab"/tmp/crontab. ...

  2. js中的刷新方法

    刷新并清除缓存: location.reload(true); 返回上一页并刷新: history.go(-1); location.reload(true); 子页面刷新父页面: self.open ...

  3. 利用KVO监视一个view的frame

    首先,keyPath一定是frame,而不是frame.origin.x之类的路径,因为再点下去的话,就是访问结构体内部的值了,KVO是无法检测的,会报错找不到KeyPath. 代码如下: [_fun ...

  4. ceph 块设备

    数据的存储设备? 数据的存储有3种形式,1种是直接以二进制数据的形式存储在裸设备(包括块设备)上,另外一种是以文件的形式经过文件系统管理进行存储.第三种就是以对象的形式进行对象存储.本篇讨论围绕着块设 ...

  5. Nodejs解析HTML网页模块 jsdom

    工作需要抓取某些网页,所以今天试用下了node下的jsdom模块.同样功能的还有jquery jsdom https://npmjs.org/package/jsdom API很简单. jsdom.e ...

  6. spring schema自定义

    今天看了一下分布式服务框架的那本书,于是里面提到了spring schema的自定义,于是去简单的了解了一下 参考资源:spring schema扩展: http://www.yihaomen.com ...

  7. TOJ 1139.Compromise

    2015-06-03 问题简述: 大概就是输入两段文本(用小写英文字母表示),分别用#表示一段话的结束输入,输出这两个文本的最长公共子序列. 简单的LCS问题,但是输入的是一段话了,而且公共部分比较是 ...

  8. BZOJ 3669: [Noi2014]魔法森林( LCT )

    排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...

  9. Linux学习之开机启动

    当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序.这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并 ...

  10. Spring学习之常用注解(转)

    使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...