Dapper简易教程

正文源自: 

本博客小编与Github上笔者(cnxy)实为同两个作者。由于作者翻译水平有限,文本中张冠李戴难免,应接指正!

 

特性


Dapper
是三个独立的公文,能够放进你的体系中用来扩张你的IDbConnection接口.

它提供了四个帮手:

正文翻译自:StackExchange.Dapper

举办叁个查询,并将结果映射到多个强类型会集中


只顾:全数扩充方法假如连接已经开拓,借使连接关闭,他们将会倒闭。

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

接纳例子:

public class Dog{    public int? Age { get; set; }    public Guid Id { get; set; }    public string Name { get; set; }    public float? Weight { get; set; }    public int IgnoredProperty { get { return 1; } }}            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;

原版教程源自:Dapper Tutorial

实施一个询问,并将结果映射到多少个动态类型会集中


该措施将进行SQL和重返三个动态集结。

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

行使例子:

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);

中文教程源自:中文Dapper教程.GitBook

执行三个命令,不回来结果


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

利用例子:

connection.Execute(@"  set nocount on   create table #t   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);

汉语教程PDF:dapper-tutorial-cn

往往施行三个指令


平等的占位符允许您方便实用的数次实施叁个命令.

选拔例子:

connection.Execute(@"insert MyTable(colA, colB) values ",    new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } }  ).IsEqualTo(3); // 3 行 被插入: "1,1", "2,2" and "3,3"

Dapper – .Net版本的简练对象映射器

性能


Dapper的叁个器重本性是性质。以下指标凸显对数据库推行500次SELECT语句并回到数据映射到对象,须要多久。

质量测验分为八个表格:

  • POCO连串化框架协理从数据库到静态类型化对象,通过应用原有的SQL。
  • 动态种类化框架协助回到动态指标的列表。
  • 杰出的框架使用。平常标准框架使用差异于最好的使用质量明智。平常它不会涉及编写制定SQL。

发行表明

请见 stackexchange.github.io/Dapper

500次询问映射的属性-POCO类别化

Method

Duration

Remarks

Hand coded (using aSqlDataReader)

47ms

Can be faster

DapperExecuteMapperQuery

49ms

ServiceStack.OrmLite(QueryById)

50ms

PetaPoco

52ms

BLToolkit

80ms

SubSonic CodingHorror

107ms

NHibernate SQL

104ms

Linq 2 SQLExecuteQuery

181ms

Entity frameworkExecuteStoreQuery

631ms

组件

Nuget稳定版:

https://www.nuget.org/packages/Dapper

Visual Studio 程序包管理器调节台:

PM> Install-Package Dappe

特点

Dapper是一个NuGet库,您能够将其增加到项目中,以恢宏您的IDbConnection接口。

它提供了3个利用方式:

500次询问映射的属性-动态类型系列化

Method

Duration

Remarks

DapperExecuteMapperQuery

48ms

Massive

52ms

Simple.Data

实行七个查询并将结果映射到强类型列表

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

示例:

public class Dog
{
    public int? Age { get; set; }
    public Guid Id { get; set; }
    public string Name { get; set; }
    public float? Weight { get; set; }

    public int IgnoredProperty { get { return 1; } }
}

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

Assert.Equal(1,dog.Count());
Assert.Null(dog.First().Age);
Assert.Equal(guid, dog.First().Id);

500次询问映射的质量-优良框架使用

Method Duration Remarks
Linq 2 SQL CompiledQuery 81ms Not super typical involves complex code
NHibernate HQL 118ms
Linq 2 SQL 559ms
Entity framework 859ms
SubSonic ActiveRecord.SingleOrDefault 3619ms

推行一个询问并将其映射到动态目的列表

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

以此方法会推行SQL语句,并赶回二个动态列表。

示例:

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

Assert.Equal(1, (int)rows[0].A);
Assert.Equal(2, (int)rows[0].B);
Assert.Equal(3, (int)rows[1].A);
Assert.Equal(4, (int)rows[1].B);

参数化查询


参数字传送递佚名类。那允许你命名参数轻松和使您能够轻松剪切和粘贴SQL代码片段在查询剖判器和平运动作它们。

new {A = 1, B = "b"} // A 会被映射出参数 @A, B 对应 @B 

实行不回去结果的通令

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

示例:

var count = 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 });
Assert.Equal(2, count);

聚拢参数的支撑


Dapper允许您通过IEnumerable,自动化您的查询参数.

采取例子:

connection.Query<int>("select * from (select 1 as Id union all select 2 union all select 3) as X where Id in @Ids", new { Ids = new int[] { 1, 2, 3 });

将会被深入分析成那样:

select * from (select 1 as Id union all select 2 union all select 3) as X where Id in (@Ids1, @Ids2, @Ids3)" // @Ids1 = 1 , @Ids2 = 2 , @Ids2 = 3

几度试行命令

还同意行使一样的参数具名方便实用地频仍实行命令(举个例子批量加载数据)

示例:

var count = 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 } }
  );
Assert.Equal(3, count); // 插入3行: "1,1", "2,2" 与 "3,3"

那适用于已经完毕IEnumerable接口的聚众对象T。

缓冲和无缓冲的读者


Dapper的暗中同意行为是实施sql和缓冲整个reader在回来。那是卓绝的在超过51%动静下,因为它最大限度地减中国少年共产党享锁在数据库和压缩了数据库在网络上的年华。

唯独当推行查询您大概供给减少内部存款和储蓄器占用并依照需求只加载对象。

性能

Dapper的叁个注重天性是性质。
以下剖断标准展现了对DB施行500个SELECT讲话并将回到的数量映射到对象所需的年月。

属性测验分为3个列表:

  • 支撑从数据库中领到静态类型对象框架的POCO连串化,使用原生SQL语句。
  • 支撑回到动态目的列表框架的动态种类化。
  • 规范的框架用法:常常规范的框架使用与极品使用品质显著例外,况且它不会提到编写制定SQL语句。

澳门新葡亰平台官网 ,三个映射


Dapper允许单个记录映射到多少个目的。那是三个根本性格,倘令你想幸免无关的查询和永不忘记加载关联的目的。

行使例子:

var sql = @"select * from #Posts p left join #Users u on u.Id = p.OwnerId Order by p.Id";var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post;});//泛型的最后一个参数是要返回的类型var post = data.First();post.Content.IsEqualTo("Sams Post1");post.Id.IsEqualTo(1);post.Owner.Name.IsEqualTo("Sam");post.Owner.Id.IsEqualTo(99);

非常重要注意Dapper要是您的Id列命名称为“Id”或“Id”,假使您的主键不是,或你想分割宽行的“Id”,使用可选的“splitOn”参数。

高出500次迭代的SELECT映射品质 – POCO系列化

方法 执行时间 备注
手工编码 (使用 SqlDataReader) 47ms  
Dapper ExecuteMapperQuery 49ms  
ServiceStack.OrmLite (使用Id查询) 50ms  
PetaPoco 52ms 可以更快
BLToolkit 80ms  
SubSonic CodingHorror 107ms  
NHibernate SQL 104ms  
Linq 2 SQL ExecuteQuery 181ms  
Entity framework ExecuteStoreQuery 631ms  

八个结实


Dapper允许您管理七个结实在三个询问中.

例子:

var sql = @"select * from Customers where CustomerId = @idselect * from Orders where CustomerId = @idselect * from Returns where CustomerId = @id";using (var multi = connection.QueryMultiple(sql, new {id=selectedId})){   var customer = multi.Read<Customer>().Single();   var orders = multi.Read<Order>().ToList();   var returns = multi.Read<Return>().ToList();   ...} 

超过500次迭代的SELECT映射品质 – 动态种类化

方法 执行时间 备注
Dapper ExecuteMapperQuery (动态) 48ms  
Massive 52ms  
Simple.Data 95ms  

积累进程


Dapper完全帮忙存款和储蓄进程

var user = cnn.Query<User>("spGetUser", new {Id = 1},         commandType: CommandType.StoredProcedure).SingleOrDefault();

尽管你想做的更非凡你能够那样:

var p = new DynamicParameters();p.Add("@a", 11);p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);cnn.Execute("spMagicProc", p, commandType: CommandType.StoredProcedure); int b = p.Get<int>("@b");int c = p.Get<int>("@c"); 

发表评论

电子邮件地址不会被公开。 必填项已用*标注