微型 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,使用请谨慎
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的语法,因为部分语法都一致,所以在第一篇就不介绍了,后续都有详细介绍,就挑几个不一样的了解一下
- 支持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发布的更多相关文章
- 微型 ORM 的第二篇 DapperLambda性能测试[Dapper比较篇]
由于这周比较忙,所以本来想做的性能测试,一直没时间,想想还是今天给补上吧 由于很多人都担心性能问题,封装之后跟Dapper的性能差距是多少,今天我给出我的测试方法,仅供参考. 创建IDbConnect ...
- 轻量级ORM框架——第一篇:Dapper快速学习
我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...
- “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第一篇
一.第一篇内容中必须得简单的介绍一下MVC(在大学时用的是WebForm,拖控件感觉很爽,但是工作后,技术总监让一定要放弃这种 想法!) 1.MVC是什么?:(1) ASP.NET MVC是微软官方提 ...
- VSCode上发布第一篇博客
在VSCode上发布到博客园的第一篇博客 前段时间在VSCode安装好插件WriteCnblog,多次检查writeCnblog configuration配置信息也是完全正确的,但是一直没能在VSC ...
- 使用cnblogs发布第一篇文章,HelloWorld
HelloWorld! 瞅瞅源码的样式,嗯,语法高亮还是可以的,辨识度还是挺高的. <!DOCTYPE html> <html> <head> <meta c ...
- DapperLambda发布
DapperLambda发布 引言:因为接触过多个ORM,但使用的时候都遇到了各自的一些不够理想的地方,从最早开始开始公司自己分装的,到后面用EF,以及Dapper和DapperExtensions ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- FluentData微型ORM
最近在帮朋友做一个简单管理系统,因为笔者够懒,但是使用过的NHibernate用来做这中项目又太不实际了,索性百度了微型ORM,FluentData是第一个跳入我眼睛的词.简单的了解下FluentDa ...
- 深入理解ajax系列第一篇——XHR对象
× 目录 [1]创建对象 [2]发送请求 [3]接收响应[4]异步处理[5]实例演示 前面的话 ajax是asynchronous javascript and XML的简写,中文翻译是异步的java ...
随机推荐
- 网易云课堂_C语言程序设计进阶_第6周:程序结构
6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...
- IBM中枪后,下一个是谁?
冯强/文 在之前的博文<信息战第二弹:中国对美国咨询公司Say no>我以前提到对美国咨询服务公司在国企开展业务的限制.有可能波及IBM.Microsoft.Google.CISCO.Or ...
- Nodejs解析HTML网页模块 jsdom
工作需要抓取某些网页,所以今天试用下了node下的jsdom模块.同样功能的还有jquery jsdom https://npmjs.org/package/jsdom API很简单. jsdom.e ...
- 动态加载 js
要实现动态加载JS脚本有4种方法: 1.直接document.write <script language="javascript"> document.write(& ...
- Java String.indexOf() 函数用法小结
1. indexOf的参数是 String, startIndex: Number; indexOf的返回值为int, 2. Function indexOf 包含如下几个格式:1). Strng. ...
- 浅谈Hash函数
什么是hash函数: hash函数也可以翻译成“散列”函数,一般就使用音译“哈希”函数,简单的说哈希函数是对任意长度的输入进行的压缩映射,所谓的压缩映射顾名思义,输出通常来说要比输入短,并且得到的输出 ...
- 《Effective C++》Item2:尽量以const,enum,inline替换#define
1. 宏定义 #define ASPECT_RATIO 1.653 该宏定义ASPECT_RATIO也许从来没有被编译器看到,也许在编译器开始处理源码之前就已经被预处理器替换了.所以记号名称ASPEC ...
- C++学习之友元类和友元函数
C++学习之友元类和友元函数 模板类声明也可以有友元,模板的友元可以分为以下几类: 1.非模板友元: 2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...
- leetcode 60. Permutation Sequence(康托展开)
描述: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of t ...
- Oracle 查询时间在当天的数据
要实现这个功能需要用到trunc这个函数对时间的操作 select trunc(sysdate) from dual --2014-12-27 今天的日期为2014-12-27 select trun ...