引言:因为接触过多个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. opensatck 在启动的时候注入额外的信息

    在配置ceph的时候建议使用metadata/cloud-init来注入额外的信息. https://raymii.org/s/tutorials/Automating_Openstack_with_ ...

  2. 截取字符串一之slice

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Unity3d 游戏汉化之IL注入文本替换--木石世纪

    近期下了个游戏叫木石世纪(Timber and Stone),沙盒游戏类,看着还不错. 搜了下游戏资料,有人求汉化可是因为是小众游戏,没人出汉化.看了眼是Unity3d的,既然是.Net的,仅仅要资源 ...

  4. 如何在VMware虚拟机上安装Linux操作系统(Ubuntu)

    作为初学者想变为计算机大牛非一朝一夕,但掌握基本的计算机操作和常识却也不是多么难的事情.所以作为一名工科男,为了把握住接近女神的机会,也为了避免当白痴,学会装系统吧!of course为避免把自己的电 ...

  5. asp.net DropDownList实现ToolTip功能

    在绑定DropDownList控件时,可能出现绑定显示的文本过长以至于超过控件长度的内容看不到,这时候就需要使用ToolTip完成其功能,即鼠标放到相应选项后就可显示其完成内容. 首先,在页面引入jQ ...

  6. GridView隔行样式

    <AlternatingRowStyle BorderColor="#FF99CC" BorderStyle="Solid" />

  7. iOS 在当前控制器中发送短信

    - (void)showMessageViewWithTel:(NSString *)tel { if( [MFMessageComposeViewController canSendText] ){ ...

  8. Gridpanel多种操作帮助文档

    1.Ext.grid.GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn:自动充 ...

  9. jjjjQuery选择器

    此文为作者自用复习文章 jQuery选择器: 它不仅继承了CSS选择器简洁的语法, 还继承了其获取页面便捷高效的特点, 它还拥有更加完善的处理机制: 但jQuery选择器获取元素后,为该元素添加的是行 ...

  10. 深度优先搜索——迷宫问题(华为oj)

    题目描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, ...