.NET 轻量级 ORM 框架

摘要:
Dapper原理通过Emit反映了IDataReader的序列队列,以快速获取和生成对象。性能提高了很多;Dapper支持net2.0,3.0,3.5,4.0。Dapper执行效率:30W数据,其中一个是对象,第一页的前15个数据。这需要0.0906879秒。SELECTmappingover 500迭代的官方测试代码和数据性能-POCOserializationMethodDurationRemarksHandcoded47msDapperExecuteMapperQuery<Post>49msPetaPoco52msCanbefasterBLToolkit80msSubSonicCodeHorror107msNHibernateSQL104msLinq2SQLExecuteQuery181msEntityframeworkExecuteStoreQuery631msSELECTmapping over 500迭代动态串行化方法DurationRemissionApper的性能Execu teMapperQuery48msMassive52msSimple。数据95ms选择映射500次迭代的性能-典型计算方法持续时间RemarksLinq2SQLCompiledQuery81ms非超典型查询复杂代码NHibernateHQL118ms Linq2SQL 559ms实体框架工作859msSubSonicActiveRecord。SingleOrDefault3619msDapper简介;使用Dapper;以下代码可用作参考:publicstatic readonlystringsqlconnectionString=“DataSource=xxx;InitialCatalog=Express;UserID=sa;Password=123”;publicstaticcreatedonlystringmysqlconnectionString=@“server=xxx;database=dddd;uid=xxx;pwd=123;charset='gbk'”;publicstaticSqlConnectionSqlConnection(){varconnection=newSqlConnection;connection.Open();returnconnection;}publicstaticMySqlConnectionMySqlConnection(){varconnection=newMySqlConnection;connection.Open();returnconnection;}调用方法SqlConnectionconnection=Program。SqlConnection();获取实体对象vard=连接。查询<狗>。单身();获取实体对象组合vardd=connection。查询<狗>。ToList<Dog>();插入数据//动态参数连接。Execute//直接传入实体连接Execute;执行查询并将结果映射到不同类型的列表注意:所有用于连接的扩展方法都已打开,如果连接关闭,它们将失败。publicstaticEnumerable<T>Query<T>示例用法:publicclassDog{publicint?

转自:https://blog.csdn.net/hanjun0612/article/details/52170204

Dapper简单介绍:

Dapper is a single file you can drop in to your project that will extend your IDbConnection interface.

Dapper是一个轻型的开源ORM类,代码就一个SqlMapper.cs文件,编译后就40多K的一个很小的Dll. 官方资料:点击这里

Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如果你知道原理也可以让它支持Mongo db

Dapper的r支持多表并联的对象。支持一对多 多对多的关系。并且没侵入性,想用就用,不想用就不用。无XML无属性。代码以前怎么写现在还怎么写。

Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。性能提升了很多;(比采用常规的反射)

Dapper支持net2.0,3.0,3.5,4.0。不过就是要配置下。如果不知道如何配置查看我博客里的在2.0下使用3.5就可以了。

语法十分简单。并且无须迁就数据库的设计。

Dapper执行效率:

30W条数据,取其中的一个对象,和第一页前15条数据,耗时0.0906879秒。这个速度超过Datable。

官方的测试代码以及数据

Performance of SELECT mapping over 500 iterations - POCO serialization

MethodDurationRemarks
Hand coded (using a SqlDataReader)47ms
Dapper ExecuteMapperQuery<Post>49ms
PetaPoco52msCan be faster
BLToolkit80ms
SubSonic CodingHorror107ms
NHibernate SQL104ms
Linq 2 SQL ExecuteQuery181ms
Entity framework ExecuteStoreQuery631ms

Performance of SELECT mapping over 500 iterations - dynamic serialization

MethodDurationRemarks
Dapper ExecuteMapperQuery (dynamic)48ms
Massive52ms
Simple.Data95ms

Performance of SELECT mapping over 500 iterations - typical usage

MethodDurationRemarks
Linq 2 SQL CompiledQuery81msNot super typical involves complex code
NHibernate HQL118ms
Linq 2 SQL559ms
Entity framework859ms
SubSonic ActiveRecord.SingleOrDefault3619ms

Dapper使用介绍:

如果你使用的是vs2012,可以使用NuGet来进行安装,会自动添加引用,使用时写入命名空间即可;

 

 using Dapper;

下面的代码可以作为使用参考:

public static readonly string sqlconnectionString = "Data Source=xxx;Initial Catalog=Express;User ID=sa;Password=123";

 
public static readonly string mysqlconnectionString = @"server=xxx;database=dddd;uid=xxx;pwd=123;charset='gbk'";
 
public static SqlConnection SqlConnection()
{
    var connection = new SqlConnection(sqlconnectionString);
    connection.Open();
    return connection;
}
 
public static  MySqlConnection  MySqlConnection()
{
    var connection = new MySqlConnection(mysqlconnectionString);
    connection.Open();
    return connection;

}

调用方法

SqlConnection connection = Program.SqlConnection();

获得一个实体对象

var d = connection.Query<Dog>("select * from dog where id = 1"null).Single<Dog>();

获得实体对象结合

var dd = connection.Query<Dog>("select * from dog where id < 10", null).ToList<Dog>();

插入数据

//动态参数
connection.Execute("INSERT INTO dog (Age,Name,Weight) VALUES (@age,@name,@Weight)",
new { @age = i,@name = Guid.NewGuid().ToString(), @Weight = i });   

//直接传入实体
connection.Execute("INSERT INTO dog (Age,Name,Weight) VALUES (@age,@name,@Weight)",model);
Execute a query and map the results to a strongly typed List



Note: all extension methods assume the connection is already open, they will fail if the connection is closed.



public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)



Example usage:



publicclassDog

{

    publicint?Age{get;set;}

    publicGuidId{get;set;}

    publicstringName{get;set;}

    publicfloat?Weight{get;set;}



    publicintIgnoredProperty{get{return1;}}

}            

            

var guid =Guid.NewGuid();

var dog = connection.Query<Dog>("select Age = @Age, Id = @Id",new{Age=(int?)null,Id= guid });

            

dog.Count()

    .IsEqualTo(1);



dog.First().Age

    .IsNull();



dog.First().Id

    .IsEqualTo(guid);



Execute a query and map it to a list of dynamic objects



public static IEnumerable<dynamic> Query (this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)



This method will execute SQL and return a dynamic list.



Example usage:



 var rows = connection.Query("select 1 A, 2 B union all select 3, 4");



((int)rows[0].A)

   .IsEqualTo(1);



((int)rows[0].B)

   .IsEqualTo(2);



((int)rows[1].A)

   .IsEqualTo(3);



((int)rows[1].B)

    .IsEqualTo(4);



Execute a Command that returns no results



public static int Execute(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null)



Example usage:



connection.Execute(@"

  set nocount on 

  create table #t(i int) 

  set nocount off 

  insert #t 

  select @a a union all select @b 

  set nocount on 

  drop table #t",new{a=1, b=2})

   .IsEqualTo(2);



Execute a Command multiple times



The same signature also allows you to conveniently and efficiently execute a command multiple times (for example to bulk-load data)



Example usage:



connection.Execute(@"insert MyTable(colA, colB) values (@a, @b)",

    new[]{new{ a=1, b=1},new{ a=2, b=2},new{ a=3, b=3}}

  ).IsEqualTo(3);// 3 rows inserted: "1,1", "2,2" and "3,3"



This works for any parameter that implements IEnumerable<T> for some T.

var dd = connection.Query<Dog>("select * from dog where id < 10"null).ToList<Dog>();

免责声明:文章转载自《.NET 轻量级 ORM 框架》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Web Worker javascript多线程编程(一)[转]使用 Angular CLI 和 ng-packagr 构建一个标准的 Angular 组件库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何用Netty实现一个轻量级的HTTP代理服务器

为什么会想通过Netty构建一个HTTP代理服务器?这也是笔者发表这篇文章的目的所在。 其主要还是源于解决在日常开发测试过程中,一直困扰测试同学很久的一个问题,现在我就来具体阐述一下这个问题。 在日常开发测试过程中,为了确保上线项目的万无一失,集成测试通常有部署,测试环境和回归环境这两套环境。开发人员根据需求编写代码模块,自测通过之后,由测试的同学更新到测...

(三)轻量级文件服务器filebrowser

既然资料都热备好了,那在外面还想看看资料,怎么办呢? 机器好的,上个nextcloud或者owncloud,我的需求只要能下载能上传即可,要不了那么多的功能,所以此处推荐一个轻量级文件服务器filebrowser。 filebrowser在GitHub上也有6.6K的star,虽然不维护了,但论基本功能却已足够。 依然是熟悉的docker化部署: 选择哪...

WebDev.WebServer40.exe改造,自己制作轻量级asp.net网站IIS服务

       大学玩asp.net时就发现VS在Debug时会起一个web服务,这东西也太神奇了服务起得这么快,而相对于IIS又这么渺小。        前几个月在用phonegap+jqmobi(被inter收购后叫App Framework)做手机应用开发。用dreamweaver CS6的云编译确实挺方便的,但是写代码的话还是比较喜欢VS的代码联想...

jvm锁的四种状态 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态

一:java多线程互斥,和java多线程引入偏向锁和轻量级锁的原因? --->synchronized是在jvm层面实现同步的一种机制。    jvm规范中可以看到synchronized在jvm里实现原理,jvm基于进入和退出Monitor对象来实现方法同步和代码块同的。在代码同步的开始位置织入monitorenter,在结束同步的位置(正常结束和...

ORM查询相关

一、多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str_...

DevOps专题|Lua引擎打造超轻量级客户端

Lua 作为一门轻量级脚本语言,源码使用标准C语言发布,语法简洁,非常适合嵌入式、客户端、游戏等场景。 Lua引擎语言特点 轻量级 源码简单,以lua最新版5.3.5为例,加上lua自身提供的lib库,仅30多个.c文件,编译后仅200多k,strip后经upx压缩,可控制在100k以下。 语法简洁 小巧灵活,支持闭包,有GC机制,通过语法糖可实现面向对...