当前位置: 56net亚洲必嬴 > 编程 > 正文

Dapper - .Net 遇到下一个粗略对象映射的框架

时间:2019-10-30 19:34来源:编程
本文源自:  本博客我与Github上小编(cnxy)实为同二个小编。由于作者翻译水平有限,文本中错误难免,应接指正!   特性 Dapper是二个单身的文本,能够放进你的门类中用来扩张你的IDb

本文源自: 

本博客我与Github上小编(cnxy)实为同二个小编。由于作者翻译水平有限,文本中错误难免,应接指正!

 

特性


Dapper 是二个单身的文本,能够放进你的门类中用来扩张你的IDbConnection接口.

它提供了八个助手:

本文内容

  • 特点
  • 性能
  • 参数化的查询
  • List 支持
  • 缓存和非缓存的 readers
  • 三个映射
  • 多少个结果
  • 积攒进程
  • Ansi Strings 和 varchar
  • 界定和注意事项
  • Dapper 能运作在自家的 db 提供者上吧?
  • 有例子的完好例子列表吗?
  • 何人在采用 Dapper?
  • 参考

换职业了,新公司的数目库层,准确地说,数据库层和漫长层使用 Dapper,那东西确实很有利~个人认为这种方便性体今后三点:

  1. 能很便利地试行数据库 DML 和 DLL 操作。举个例子,当您施行三个带参数的 SQL 时,SQL 中的变量能与你传递给它的实业或无名氏对象中的属性,自定相配。而我们精晓,带参数的 SQL,能加强数据库推行 SQL 的功用;
  2. 能很有利地将数据库检索结果映射为面向对象的指标。从数据库中的检索结果,通常是张二维表,如 DataTable,而应用程序中是实体类,以致实体类的聚众,那么 Dapper 能够将 DataTable 自动地照耀成为实体类的集纳;
  3. 能很便利地书写 SQL 语句。比方,写多少个 SQL,用分号分隔。

本文翻译自: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;

下载 Demo

原版教程源自: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 项目,项目中有 Dapper 的测验示例和质量测量检验例子)

中文教程源自:中文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);

(Dapper 的示范使用 SQLServer 数据库,笔者个人的身体力行是 MySQL)

华语教程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"

www.56.net,特点


Dapper 唯有八个文件,你能够把它拖到你的门类中,来扩充你的 IDbConnection 接口。

它提供了三上边的辅助:

Dapper - .Net版本的简易对象映射器

性能


Dapper的一个主要天性是性质。以下目标展现对数据库施行500次SELECT语句并再次回到数据映射到目的,要求多久。

个性测验分为八个表格:

  • POCO连串化框架协助从数据库到静态类型化对象,通过动用原本的SQL。
  • 动态系列化框架扶助回到动态目的的列表。
  • 出色的框架使用。平常规范框架使用差异于最棒的使用质量明智。经常它不会涉嫌编写制定SQL。

实施四个询问,并把结果映射到贰个强类型 list

留意:全部的扩充方法都要是数据库连接已张开,假设关闭连接,它们将退步。

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

批零表明

请见 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

实践二个询问,并把结果映射到三个动态 object 的 list

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

该方法将执行 SQL,并回到一个动态 list,即 var 变量。

用法:

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

rows[0] 这种访谈方式会出错,不明了示例是怎么给的~

组件

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

试行二个不回来结果的 Command

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

用法:

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

执行二个询问并将结果映射到强类型列表

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

数次实践一个 Command


长期以来的签字也得以令你方便快捷地对多个发令实行数十四回,例如批量加载数据(bulk-load data)。

用法:

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"

对别的项目完毕 TIEnumerable 的参数都足以施行。

实践贰个查询并将其映射到动态指标列表

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 

性能


Dapper 的根本特色是性质。以下数据展现对三个数据库奉行 SELECT 出 500 条,并把多少映射到目的中要求多久。

属性测验分为八个方面:

  • POCO 体系化框架,帮忙从数据库获得静态类型的靶子。使用原本的 SQL。
  • 动态系列化框架,支持回到对象的动态列表。
  • 优质的框架用法。往往不会涉嫌编写制定 SQL。

编辑:编程 本文来源:Dapper - .Net 遇到下一个粗略对象映射的框架

关键词: