微型 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 ...
随机推荐
- SLC和MLC闪存芯片的区别
许多人对闪存的SLC和MLC区分不清.就拿目前热销的MP3随身听来说,是买SLC还是MLC闪存芯片的呢?在这里先告诉大家,如果你对容量要求不高,但是对机器质量.数据的安全性.机器寿命等方面要求较高,那 ...
- [Leetcode][Python]24: Swap Nodes in Pairs
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 24: Swap Nodes in Pairshttps://oj.leetc ...
- saiku导出excel单元格格式与中文列宽自动适应
在saiku导出excel后打开发现单元格的整数也显示为小数,并且含有中文的列宽没有自动适应,解决办法如下: 打开ExcelWorksheetBuilder.java文件,找到applyCellFor ...
- hadoop技术基本架构
一.Hadoop概述 hadoop由两部分组成.各自是分布式文件系统和分布式计算框架MapReduce.当中.分布式文件系统主要用于大规模数据的分布式存储.而MapReduce 则构建在分布式文件系 ...
- Oracle存储过程返回一张表数据
在oracle数据库中你要在程序里得到一张表的数据就必须先创建游标和SQL Service不一样. --创建游标create or replace package pkg_Dataas type re ...
- hive j简单邮件过滤
select min(call_log), a.mail_subject from (select mail_to,mail_subject from dw_user_deviler_201408 w ...
- WPF之Binding的三种简单写法
环境 类代码 public class Person:INotifyPropertyChanged { private string name; public string Name { get { ...
- DataGridView插入一行数据和用DataTable绑定数据2种方式
以前不会用DataGridView的时候一直使用DataTable绑定的方式,如下: DataTable table = new DataTable(); //给表添加一列Name,此名字和 tabl ...
- C++学习之文件的输入输出
C++学习之文件的输入输出 一.文件的打开与关闭 1.输出数据到文件 文件的操作需要包含fstream头文件,文件的操作对象为ifstream,ofstrea ...
- jQuery实时获取checkbox状态问题
在最近的项目开发中,使用jQuery操作checkbox时,发现一个问题. Html代码如下: <body> <div> <inputtype="checkbo ...