澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

Dapper简易教程,net平台性能很不错的轻型ORM类D

2019-05-18 作者:www.8455.com   |   浏览(74)

正文源自: 

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

 

特性


Dapper 是1个单身的文本,能够放进你的连串中用来扩张你的IDbConnection接口.

它提供了四个帮手:

本文内容

  • 特点
  • 性能
  • 参数化的询问
  • List 支持
  • 缓存和非缓存的 readers
  • 多少个映射
  • 多少个结果
  • 存储进度
  • Ansi Strings 和 varchar
  • 限定和注意事项
  • Dapper 能运作在小编的 db 提供者上吗?
  • 有例子的总体例子列表吗?
  • 哪个人在使用 Dapper?
  • 参考

跳槽了,新集团的数码库层,精确地说,数据库层和长久层使用 Dapper,这东西确实很方便~个人以为这种方便性呈现在3点:

  1. 能很便宜地实践数据库 DML 和 DLL 操作。举个例子,当您推行一个带参数的 SQL 时,SQL 中的变量能与你传递给它的实业或无名对象中的属性,自定相称。而大家精通,带参数的 SQL,能增高数据库实行 SQL 的效能;
  2. 能很便利地将数据库检索结果映射为面向对象的对象。从数据库中的检索结果,经常是张2维表,如 DataTable,而应用程序中是实体类,以及实体类的联谊,那么 Dapper 能够将 DataTable 自动地照耀成为实体类的聚众;
  3. 能很便宜地挥毫 SQL 语句。举个例子,写七个 SQL,用分号分隔。

正文内容

  • 特点
  • 性能
  • 参数化的询问
  • List 支持
  • 缓存和非缓存的 readers
  • 五个映射
  • 四个结果
  • 存款和储蓄进度
  • Ansi Strings 和 varchar
  • 限定和注意事项
  • Dapper 能运作在自己的 db 提供者上啊?
  • 有例子的完整例子列表吗?
  • 什么人在运用 Dapper?
  • 参考

跳槽了,新公司的多寡库层,准确地说,数据库层和长久层使用 Dapper,那东西确实很有益~个人感觉这种方便性浮以往③点:

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

dapper唯有三个代码文件,完全开源,你能够投身项目里的其余地方,来贯彻多少到指标的O卡宴M操作,体量小速度快。 使用O宝马7系M的收益是增、删、改比异常快,不用本身写sql,因为那都是再一次本领含量低的劳作,还有便是程序中大批量的从数据库中读数据然后创设model,并为model字段赋值。那一个O哈弗M都能够轻巧给你消除。OBMWX3M给大家开拓带来方便时,品质也是二个让大家不得不思量的难点。一般的O奥迪Q7M品质和一向写原生的sql比都差不少,然则Dapper品质还很错,乃至和DbHelperSQL格局品质超过大多。

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

下载 Demo

下载地址:

原版教程源自:Dapper Tutorial

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


该办法将举行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 项目,项目中有 Dapper 的测试示例和性质测试例子)

假使你兴奋原生的Sql语句,又喜欢O昂CoraM的简练,这您早晚上的集会欣赏上Dapper那款ROM。

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

(Dapper 的演示使用 SQLServer 数据库,作者个人的示范是 MySQL)

 

汉语教程PDF:dapper-tutorial-cn

频仍推行三个命令


坚定不移的占位符允许您方便有效的再3实践1个命令.

应用例子:

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 只有3个文件,你能够把它拖到你的品种中,来扩展你的 IDbConnection 接口。

它提供了三方面包车型大巴扶植:

特点


Dapper 唯有八个文件,你可以把它拖到你的门类中,来扩大你的 IDbConnection 接口。

它提供了叁上边的相助:

相关dapper实际项目源码下载:

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

施行二个查询,并把结果映射到贰个强类型 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;

 

dog.First().Age

    .IsNull();

 

dog.First().Id

    .IsEqualTo;

依据ASP.NET MVC伍和dapper的SEO关键词按天计费系统源码

发行表达

请见 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] 这种访问方式会出错,不知底示例是怎么给的~

实行二个查询,并把结果映射到一个动态 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;

 

((int)rows[0].B)

   .IsEqualTo;

 

((int)rows[1].A)

   .IsEqualTo;

 

((int)rows[1].B)

    .IsEqualTo;

rows[0] 这种访问格局会出错,不清楚示例是怎么给的~

dapper ASP.NET MVC5sql小说&博客网址源码

组件

Nuget稳定版:

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

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

PM> Install-Package Dappe

特点

Dapper是一个NuGet库,您能够将其增添到项目中,以扩充您的IDbConnection接口。

它提供了一个使用方法:

500次询问映射的质量-动态类型系列化

Method

Duration

Remarks

DapperExecuteMapperQuery

48ms

Massive

52ms

Simple.Data

Dapper简易教程,net平台性能很不错的轻型ORM类Dapper。试行一个不回来结果的 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);

实行1个不回来结果的 Command

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;

mvc5 dapper bootstrap2通用权限后台管理系列源码

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

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 的参数都能够实行。

壹再实践3个 Command


一样的签署也足以让您方便快速地对三个限令实行多次,举个例子批量加载数据(bulk-load data)。

用法:

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 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 的机要特征是性质。以下数据展现对3个数据库执行 SELECT 出 500 条,并把数据映射到目的中供给多久。

质量测试分为四个地点:

  • POCO 类别化框架,协理从数据库获得静态类型的对象。使用原来的 SQL。
  • 动态连串化框架,援助回到对象的动态列表。
  • 独立的框架用法。往往不会涉及编写制定 SQL。

性能


Dapper 的重大特点是性质。以下数据展现对一个数据库推行 SELECT 出 500 条,并把数据映射到对象中须求多久。

品质测试分为多少个地点:

  • POCO 连串化框架,帮忙从数据库获得静态类型的对象。使用原有的 SQL。
  • 动态种类化框架,补助回到对象的动态列表。
  • 特出的框架用法。往往不会涉嫌编写制定 SQL。

 

施行不回去结果的授命

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

Performance of SELECT mapping over 500 iterations - POCO 序列化

方法

持续时间(毫秒)

备注

Hand coded (using a SqlDataReader)

47

Can be faster

Dapper ExecuteMapperQuery

49

同上

ServiceStack.OrmLite (QueryById)

50

同上

PetaPoco 

52

同上

BLToolkit

80

同上

SubSonic CodingHorror

107

同上

NHibernate SQL

104

同上

Linq 2 SQL ExecuteQuery

181

同上

Entity framework ExecuteStoreQuery

631

同上

Performance of SELECT mapping over 500 iterations - POCO 序列化

方法

持续时间

备注

Hand coded (using a SqlDataReader)

47

Can be faster

Dapper ExecuteMapperQuery

49

同上

ServiceStack.OrmLite (QueryById)

50

同上

PetaPoco 

52

同上

BLToolkit

80

同上

SubSonic CodingHorror

107

同上

NHibernate SQL

104

同上

Linq 2 SQL ExecuteQuery

181

同上

Entity framework ExecuteStoreQuery

631

同上

Dapper的优势:

1,Dapper是一个轻型的O本田CR-VM类。代码就2个SqlMapper.cs文件,编写翻译后就40K的3个异常的小的Dll.
贰,Dapper比不慢。Dapper的快慢临近与IDataReader,取列表的数量超越了DataTable。
3,Dapper辅助什么数据库。Dapper帮助Mysql,SqlLite,Mssql两千,Mssql200五,Oracle等1类别的数据库,当然假诺你领会原理也足以让它辅助Mongo db
四,Dapper的r补助多表并联的指标。援救一对多 多对多的关系。并且没侵入性,想用就用,不想用就无须。无XML无属性。代码从前怎么写将来还怎么写。
伍,Dapper原理通过Emit反射IDataReader的行列队列,来飞速的收获和爆发对象。品质实在高高。
六,Dapper援助net二.0,叁.0,三.伍,四.0。【要是想在Net二.0下采纳,能够去网络找一下Net二.0下哪些安排运转Net三.伍就可以。】
7,Dapper语法拾叁分简练。并且不要退让数据库的统一计划。

几度施行命令

还同意利用一样的参数签字方便实用地反复推行命令(比方批量加载数据)

示例:

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在重回。那是优秀的在繁多状态下,因为它最大限度地减中国少年共产党享锁在数据库和削减了数据库在网络上的日子。

但是当试行查询您或者需求缩短内部存款和储蓄器占用并依赖要求只加载对象。

Performance of SELECT mapping over 500 iterations - dynamic 序列化

方法

持续时间(毫秒)

备注

Dapper ExecuteMapperQuery (dynamic)

48

 

Massive

52

 

Simple.Data

95

 

Performance of SELECT mapping over 500 iterations - dynamic 序列化

方法

持续时间

备注

Dapper ExecuteMapperQuery

48

 

Massive

52

 

Simple.Data

95

 

dapper的安装

在nuget个中寻找Dapper

澳门新萄京官方网站 1

点击“安装”,会下载Dapper.dll,并把引用增多到项目中。

 

上面介绍Dapper怎么样使用,来举办急忙开拓,以下操作dapper是编写翻译后在Net肆.0下操作的事例。

性能

Dapper的一个最首要特性是性质。 以下衡量准则突显了对DB奉行500个SELECT话语并将回来的数目映射到目的所需的时光。

天性测试分为1个列表:

  • 援救从数据库中提取静态类型对象框架的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”参数。

Performance of SELECT mapping over 500 iterations - 标准用法

方法

持续时间(毫秒)

备注

Linq 2 SQL CompiledQuery

81

Not super typical involves complex code

NHibernate HQL

118

 

Linq 2 SQL

559

 

Entity framework

859

 

SubSonic ActiveRecord.SingleOrDefault

3619

 

Performance of SELECT mapping over 500 iterations - 规范用法

方法

持续时间

备注

Linq 2 SQL CompiledQuery

81

Not super typical involves complex code

NHibernate HQL

118

 

Linq 2 SQL

559

 

Entity framework

859

 

SubSonic ActiveRecord.SingleOrDefault

3619

 

1、定义一个Person类对应数据库的Person表

CREATE TABLE [Person](
    [id] [int] IDENTITY(5,1) NOT NULL primary key nonclustered,
    [username] [nvarchar](100) NULL,
    [password] [nvarchar](100) NULL,
    [age] [int] NULL,
    [registerDate] [datetime] NULL,
    [address] [nvarchar](150) NULL
)

public class Person
{
        public int id { get; set; }
        public string username { get; set; }
        public string password { get; set; }
        public int age { get; set; }
        public DateTime registerDate { get; set; }
        public string address { set; get; }
}

超过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();   ...} 

参数化的询问


参数能够当做佚名类来传递。这令你能够轻松地给命名参数,只要轻巧地分开和粘贴 SQL 片断,并在查询分析器中实施就能够。

new {A = 1, B = "b"} // A will be mapped to the param @A, B to the param @B 

参数化的询问


参数能够当做无名类来传递。那使您能够轻便地给命名参数,只要轻易地撩拨和粘贴 SQL 片断,并在询问分析器中进行就能够。

new {A = 1, B = "b"} // A will be mapped to the param @A, B to the param @B 

2、定义连接数据库字符串

public static string ConnString = "Server=.;Database=Test1;uid=sa;pwd=sa;";

超越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"); 

List 支持


Dapper 运维让您传递 IEnumerable,自动地参数化的询问。

比方下边 SQL 的 in 查询:

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

List 支持


Dapper 运转令你传递 IEnumerable,自动地参数化的查询。

譬喻说上面 SQL 的 in 查询:

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

三、获取id大于2的有着Person,dapper重回类型是List类型

 public static List<Person> GetPersonList()
 {
        using (var conn = new System.Data.SqlClient.SqlConnection(ConnString))
        {
             conn.Open();
             var a = conn.Query<Person>("select * from Person where id>@id", new { id = 2 });
             conn.Close();
             return a.ToList();
        }
 }

那般回去的是List类型,能够丰盛利用linq的好处。

跨越500次迭代的SELECT映射品质 - 标准用法

方法 执行时间 备注
Linq 2 SQL CompiledQuery 81ms 非典型的且不涉及复杂的代码
NHibernate HQL 118ms  
Linq 2 SQL 559ms  
Entity framework 859ms  
SubSonic ActiveRecord.SingleOrDefault 3619ms  

属性基准测试新闻 点击这里.

能够轻松提交包涵别的O路虎极光M的补丁 - 运转规则测试时,请保管在Release中编写翻译,且不能够附加调节和测试器 (Ctrl F伍).

抑或,你能够利用Frans Bouma的RawDataAccessBencher或OrmBenchmark测试套件作为测试工具使用。

Ansi字符串和varchar


Dapper支持varchar params,要是你是贰个varchar列上实践3个where子句使用参数一定要经过它以这种办法:

Query<Thing>("select * from Thing where Name = @Name", new {Name = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

在Sql Server上根本,查询时选取unicode unicode和ansi当查询非unicode的时候。

缓存和非缓存的 readers


Dapper 的私下认可动作是推行 SQL 并在重临时缓冲整个 reader。在许多处境下,那是天时地利的,因为它能最大限度地压缩数据库中的共享锁,以及收缩数据库的网络时间。

只是,在实行变得庞大查询时,你也许为了减弱内部存款和储蓄器的占领,只加载供给的目的。要造成那点,通过缓冲到查询方式中。

/// <summary>

/// NonBuffered

/// 将会抛出异常,Invalid attempt to Read when reader is closed.

/// </summary>

public static void TestBasicStringUsageAsyncNonBuffered()

{

    var query = DbHelp.QueryAsync<string>(new CommandDefinition("select 'abc' as Value union all select @txt", new { txt = "def" }, flags: CommandFlags.None));

    var arr = query.Result.ToArray();

    arr.IsSequenceEqualTo(new[] { "abc", "def" });

}

 

/// <summary>

/// Buffered

/// 不会抛出异常

/// </summary>

public static void TestBasicStringUsageAsyncBuffered()

{

    var query = DbHelp.QueryAsync<string>(new CommandDefinition("select 'abc' as Value union all select @txt", new { txt = "def" }, flags: CommandFlags.Buffered));

    var arr = query.Result.ToArray();

    arr.IsSequenceEqualTo(new[] { "abc", "def" });

}

/// <summary>

/// Pipelined

/// 将会抛出异常,Invalid attempt to Read when reader is closed.

/// </summary>

public static void TestBasicStringUsageAsyncPipelined()

{

    var query = DbHelp.QueryAsync<string>(new CommandDefinition("select 'abc' as Value union all select @txt", new { txt = "def" }, flags: CommandFlags.Pipelined));

    var arr = query.Result.ToArray();

    arr.IsSequenceEqualTo(new[] { "abc", "def" });

}

缓存和非缓存的 readers


Dapper 的默许动作是实行 SQL 并在重返时缓冲整个 reader。在许多情状下,那是了不起的,因为它能最大限度地减小数据库中的共享锁,以及缩短数据库的互联网时间。

可是,在实施庞大查询时,你可能为了减小内部存款和储蓄器的据有,只加载必要的靶子。要到位这一点,通过缓冲到查询办法中。

/// <summary>

/// NonBuffered

/// 将会抛出异常,Invalid attempt to Read when reader is closed.

/// </summary>

public static void TestBasicStringUsageAsyncNonBuffered()

{

    var query = DbHelp.QueryAsync<string>(new CommandDefinition("select 'abc' as Value union all select @txt", new { txt = "def" }, flags: CommandFlags.None));

    var arr = query.Result.ToArray();

    arr.IsSequenceEqualTo(new[] { "abc", "def" });

}

 

/// <summary>

/// Buffered

/// 不会抛出异常

/// </summary>

public static void TestBasicStringUsageAsyncBuffered()

{

    var query = DbHelp.QueryAsync<string>(new CommandDefinition("select 'abc' as Value union all select @txt", new { txt = "def" }, flags: CommandFlags.Buffered));

    var arr = query.Result.ToArray();

    arr.IsSequenceEqualTo(new[] { "abc", "def" });

}

/// <summary>

/// Pipelined

/// 将会抛出异常,Invalid attempt to Read when reader is closed.

/// </summary>

public static void TestBasicStringUsageAsyncPipelined()

{

    var query = DbHelp.QueryAsync<string>(new CommandDefinition("select 'abc' as Value union all select @txt", new { txt = "def" }, flags: CommandFlags.Pipelined));

    var arr = query.Result.ToArray();

    arr.IsSequenceEqualTo(new[] { "abc", "def" });

}

四、dapper批量插入数据

public static void Execute()
{
    using (var conn = new SqlConnection(ConnString))
    {
        conn.Open();
        var r=conn.Execute(@"insert Person(username, password,age,registerDate,address) values (@a, @b,@c,@d,@e)",
        new [] { 
            new { a = 1, b = 1, c = 1, d = DateTime.Now, e = 1 }
            , new { a = 2, b = 2, c = 2, d = DateTime.Now, e = 2 }
            , new { a = 3, b = 3, c = 3, d = DateTime.Now, e = 3 } 
        }
                conn.Close();
         }
 );

施行下面方法会插入三条记下,那样sql能够灵活的垄断,参数不用像ADO.Net那样注脚每一个参数,最终还要把参数集结赋值给ADO的命令。能够看出那样轻松多了。

澳门新萄京官方网站 2

参数化查询

能够佚名类型作为参数实行传递,那能够轻易地命名那些参数名称,且能够在数据库平台的询问深入分析器中简单地使用剪切、粘贴SQL语句并运营。

new {A = 1, B = "b"} // A映射到参数@A,B映射到参数@B

界定和警戒


Dapper缓存音信各种查询在它运转时,那使它不慢落成目的和工艺参数。当前的兑今后ConcurrentDictionary最终对象缓存这个音信。它存款和储蓄的靶子不会被刷新。要是您是动态生成SQL字符串不选择参数有希望你将境遇内部存款和储蓄器难题。我们得以把词典转变为三个LRU缓存。

七个映射


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'参数。

八个映射


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;

post.Owner.Name.IsEqualTo("Sam");

post.Owner.Id.IsEqualTo;

提示:Dapper 假定你的 ID 列被命名字为“ID”或“id”,如若您的主键是例外的,只怕您想在点上拆分宽行点,而不是“ID”,能够行使可选的'splitOn'参数。

5、dapper修改数据,update

public static bool Update()
{
    using (var conn = new SqlConnection(ConnString))
    {
        conn.Open();
        var r = conn.Execute(@"update Person set password='www.lanhuseo.com' where username=@username", new { username = 2 });
        conn.Close();
        return r > 0;
    }
}

列表帮忙

Dapper允许将IEnumerable<int>用作传递参数,并能够活动地参数化查询

例子:

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

自己能在本身的数据库中使用呢?


Dapper未有DB具体的落成细节,它在装有工作。净ADO提供者includingSQLite、SQL CE、火鸟、Oracle、MySQL、PostgreSQL和SQL服务器。

四个结果


Dapper 允许你在3回查询中管理两个结实的集合。

例如:

var sql = 

@"

select * from Customers where CustomerId = @id

select * from Orders where CustomerId = @id

select * 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();

   ...

} 

八个结实


Dapper 允许你在三回查询中拍卖七个结果的聚焦。

例如:

var sql = 

@"

select * from Customers where CustomerId = @id

select * from Orders where CustomerId = @id

select * 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();

   ...

} 

6、dapper删除数据

public static bool Delete()
{
    using (var conn = new SqlConnection(ConnString))
    {
        conn.Open();
        var r = conn.Execute(@"delete from Person where id=@id", new { id = 2 });
        conn.Close();
        return r > 0;
    }
}

文字取代

Dapper协助布尔与数字类型的文字替代。

connection.Query("select * from User where UserId = {=Id}", new {Id = 1}));

文字替换不作为参数发送; 更加好的布置和过滤索引用法将被允许,但常见应严峻在测试后接纳。 当注入的值实际上是固定值(比方,特定于查询的“种类ID”,“状态代码”或“区域”)时,此功能极其有用。 当你在构思文字live数据时,也可能有望想到also并测试特定于提供程序的查询提醒,如含有常规参数的OPTIMIZE FOR UNKNOWN

储存进度


Dapper 完全辅助存款和储蓄进程:

var user = cnn.Query<User>("spGetUser", new {Id = 1}, 

        commandType: CommandType.StoredProcedure).First();}}}

万一您想要更加灵敏的操作,能够这么做:

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

Ansi Strings 和 varchar


Dapper 扶助 varchar 参数,若是您在三个 varchar 列上实行1个 where 语句,确定保证上边形式传递参数:

Query<Thing>("select * from Thing where Name = @Name", new {Name = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

在 SQL Server 上,当查问非 Unicode 时,查询 Unicode 和 ANSI 时需求使用 Unicode。

储存进度


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

var user = cnn.Query<User>("spGetUser", new {Id = 1}, 

        commandType: CommandType.StoredProcedure).First();}}}

假若你想要更加灵敏的操作,可以这么做:

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

Ansi Strings 和 varchar


Dapper 协理 varchar 参数,倘让你在三个 varchar 列上实行叁个 where 语句,确认保障上边格局传递参数:

Query<Thing>("select * from Thing where Name = @Name", new {Name = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

在 SQL Server 上,当查问非 Unicode 时,查询 Unicode 和 ANSI 时索要运用 Unicode。

柒、dapper使用职业

using (var conn = new SqlConnection(ConnString))
{
    conn.Open();
    IDbTransaction trans = conn.BeginTransaction();
    int row = conn.Execute(@"update Person set password='www.lanhuseo.com' where id=@id", new { id = 3 }, trans, null, null);
    row  = conn.Execute("delete from Person where id=@id", new { id = 5 }, trans, null, null);
    trans.Commit();
}

缓冲与未缓冲阅读器

Dapper的暗许行为是实施SQL并在回去时缓冲整个阅读器。 在大繁多景况下,这是有口皆碑的,因为它最小化了数据库中的共享锁并压缩了数据库网络时间。

可是,在进行大气查询时,恐怕必要最小化内部存款和储蓄器占用并仅依据供给加载对象。 为此,将buffered:false传递给Query方法。

限制和注意事项


对于 Dapper 试行的各样查询的缓存音信,使得它能够非常的慢地物化对象和拍卖参数。当前的落实把新闻缓存在1个ConcurrentDictionary 对象中。它存款和储蓄的指标恒久不会被刷新。若是您转移的 SQL 字符串未有行使参数,那么大概会出现命中内部存款和储蓄器难点。我们把字典转换成LRU(Least Recently Used)缓存。

O揽胜M 的多多表征都被 Dapper 去掉了,未有地方地图(Identity Map),未有更新/选拔的入手等。

Dapper 不会处理你总是的生命周期,它①旦它赢得的接连是开荒的,并且不存在 DataReader 枚举(除非启用 MAPRADOS)。

什么样是 马尔斯?它是在开创数据库连接时钦命的,上面是 Dapper 中接2连三 SQL Server 的亲自过问:

public static SqlConnection GetOpenConnection(bool mars = false)

{

    var cs = connectionString;

    if (mars)

    {

        SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(cs);

        scsb.MultipleActiveResultSets = true;

        cs = scsb.ConnectionString;

    }

    var connection = new SqlConnection(cs);

    connection.Open();

    return connection;

}

假使钦点了 马尔斯,那么还会成立 SqlConnectionStringBuilder,并点名其 MultipleActiveResultSets 属性为 true。不过,看 Dapper 的例子,貌似 SQL Server 是有 Mars 的,但 MySQL 没有。

界定和注意事项


对于 Dapper 实施的每一个查询的缓存信息,使得它能够比一点也不慢地物化对象和拍卖参数。当前的落到实处把音讯缓存在二个ConcurrentDictionary 对象中。它存款和储蓄的目的永世不会被刷新。假使您转移的 SQL 字符串未有应用参数,那么恐怕会现身命中内部存款和储蓄器难题。大家把字典调换来LRU(Least Recently Used)缓存。

OGL450M 的过多表征都被 Dapper 去掉了,未有地方地图(Identity Map),未有更新/采纳的助手等。

Dapper 不会管理你总是的生命周期,它1旦它赢得的连接是开辟的,并且不存在 DataReader 枚举(除非启用 MA揽胜S)。

什么是 马尔斯?它是在创制数据库连接时钦点的,上边是 Dapper 中总是 SQL Server 的身体力行:

public static SqlConnection GetOpenConnection(bool mars = false)

{

    var cs = connectionString;

    if 

    {

        SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder;

        scsb.MultipleActiveResultSets = true;

        cs = scsb.ConnectionString;

    }

    var connection = new SqlConnection;

    connection.Open();

    return connection;

}

假定钦定了 马尔斯,那么还会创造 SqlConnectionStringBuilder,并点名其 MultipleActiveResultSets 属性为 true。不过,看 Dapper 的例子,貌似 SQL Server 是有 Mars 的,但 MySQL 没有。

八、dapper集合批量插入

public static int InsertMultiple<T>(string sql, IEnumerable<T> entities, string connectionName = null) where T : class, new()
{
    using (SqlConnection cnn = GetOpenConnection(connectionName))
    {
        int records = 0;
        using (var trans = cnn.BeginTransaction())
        {
            try
            {
                cnn.Execute(sql, entities, trans, 30, CommandType.Text);
            }
            catch (DataException ex)
            {
                trans.Rollback();
                throw ex;
            }
            trans.Commit();
        }
        //foreach (T entity in entities)
        //{
        //    records  = cnn.Execute(sql, entity);
        //}
        return records;
    }
}

Dapper帮助集结的插入,集结提交是一句直接的插入命令,所以速度会快多数。

经过地点的实例能够观察sql语句完全部是大家和煦说了算,对于对EF和NHibernate这么些活动给大家生成sql语句的这种体制不爽的同班就有便利了,作者个人感到那些Dapper和iBatis.Net机制都大约,都是sql语句都是一点一滴由程序猿自个儿写,框架自己只负担数据调换成我们须求的Model相关的目的,那样程序质量获得了保证,可是也可能有1个不佳的位置的具备的sql语句都要团结写,举例增、删、查、改,假如3个类型有不少个表,专门的学问量也一点都不小,辛亏有代码生成器把我们解放出来,比方:Codesmith。Dapper和iBatis.Net是大的不同是,Dapper越发轻便和轻量,不用像iBatis.Net配置xml文件。

从今小编认知了那一个Dapper,项目只要品质供给比较好的状态下自家就能够率先Dapper,Dapper轻巧和轻量让笔者以为亲密。

多种映射

Dapper允许将单个行映射到八个指标。 假使想防止无关的查询和及时加载关联,那是1个很珍视的特点。

例子:

研讨那四个类: Post and User

class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public User Owner { get; set; }
}

class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

今后大家要把posts表单与users表单进行映射查询。到如今停止,要是大家须要整合二个查询的结果,大家须要3个新的对象来发表它,但在这种景况下将User目标放在Post对象中更有意义。

这是多种映射的用户案例。你告知dapper查询重回一个Post和一个User指标,然后给它讲述您想要对含有PostUser指标的每一行做什么的函数。 在大家的例证中,大家想要获取用户对象并将其位于post对象中。所以编写函数如下:

(post, user) => { post.Owner = user; return post; }

Query办法的二个门类参数钦赐dapper应该使用什么对象及再次来到的内容举行反类别化行。我们将把这两行解释为PostUser的结合,然后大家回来贰个Post对象。 由此类型表明变为

<Post, User, Post>

享有东西都坐落一块儿,看起来像那样:

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

Assert.Equal("Sams Post1", post.Content);
Assert.Equal(1, post.Id);
Assert.Equal("Sam", post.Owner.Name);
Assert.Equal(99, post.Owner.Id);

Dapper能够透过假若Id列被命名叫“Id”或“id”来拆分重临的行。 要是主键不一致只怕希望将行拆分为“Id”以外的别的地点,请使用可选的splitOn参数。

Dapper 能运转在自己的 db 提供者上呢?


Dapper 能运作在具有 .net ado 提供者上,包含sqlite,sqlce,firebird,oracle,MySQL,PostgreSQL 和 SQL Server。

Dapper 能运作在本人的 db 提供者上吗?


Dapper 能运作在具有 .net ado 提供者上,包蕴sqlite,sqlce,firebird,oracle,MySQL,PostgreSQL 和 SQL Server。

多种结果

Dapper允许在单个查询中管理多个结实。

例子:

var sql =
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * 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();
   ...
}

有例子的1体化例子列表吗?


Dapper 在测试项目中有完整的测试套件。

有例子的欧洲经济共同体例子列表吗?


Dapper 在测试项目中有完整的测试套件。

仓库储存过程

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

谁在行使 Dapper?


近日应用 Dapper 的有 Stack Overflow 和 helpdesk。

(if you would like to be listed here let me know)

哪个人在应用 Dapper?


脚下使用 Dapper 的有 Stack Overflow 和 helpdesk。

(if you would like to be listed here let me know)

Ansi字符串和varchar

Dapper协助varchar参数,借使运用param在varchar列上进行where子句,请确定保障以这种办法传送它:

Query<Thing>("select * from Thing where Name = @Name", new {Name = new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

在SQL Server中,使用unicode编码查询unicode与ANSI编码或询问非unicode编码时,变得至关心珍视要。

参照他事他说加以考察资料


  • github Dapper
  • stackoverflow Dapper
  • A Look at Dapper.NET

 

下载 Demo

参谋资料


  • github Dapper
  • stackoverflow Dapper
  • A Look at Dapper.NET

 

下载 Demo

每行类型转变

平凡,本人盼望将给定表中的全部行视为同一的数据类型。 可是,在好几意况下,能够将不相同的行分析为分歧的数据类型是行得通的。 那正是IDataReader.GetRowParser派上用场的地点。

假诺有八个名称为“Shapes”的数量库表,个中带有列:IdTypeData,你想要基于Type列的值将它的行深入分析为CircleSquareTriangle对象。

var shapes = new List<IShape>();
using (var reader = connection.ExecuteReader("select * from Shapes"))
{
    // Generate a row parser for each type you expect.
    // The generic type <IShape> is what the parser will return.
    // The argument (typeof(*)) is the concrete type to parse.
    var circleParser = reader.GetRowParser<IShape>(typeof(Circle));
    var squareParser = reader.GetRowParser<IShape>(typeof(Square));
    var triangleParser = reader.GetRowParser<IShape>(typeof(Triangle));

    var typeColumnIndex = reader.GetOrdinal("Type");

    while (reader.Read())
    {
        IShape shape;
        var type = (ShapeType)reader.GetInt32(typeColumnIndex);
        switch (type)
        {
              case ShapeType.Circle:
                shape = circleParser(reader);
                break;
            case ShapeType.Square:
                shape = squareParser(reader);
                break;
            case ShapeType.Triangle:
                shape = triangleParser(reader);
                break;
              default:
                throw new NotImplementedException();
        }

          shapes.Add(shape);
    }
}

限定与告诫

Dapper缓存有关它运维的种种查询的信息,那使它亦可极快完结目的并飞速处理参数。 当前兑现将此新闻缓存在ConcurrentDictionary目的中。仅使用1回的言语日常会从此缓存中刷新。固然如此,要是你在不选拔参数的场地下动态生成SQL字符串,则大概会遇上内部存款和储蓄器难点。

Dapper的简洁性意味着OLX570M附带的重重效果都被剥离了。Dapper顾忌95%的景况,并为您提供大多数时间所需的工具,并不希图缓慢解决全数失水准。

Dapper帮忙什么数据库?

Dapper未有一定于DB的落到实处细节,它适用于全部.NET ADO提供程序,包罗SQLite(https://www.sqlite.org/),SQL),SQL CE,Firebird,Oracle,MySQL,PostgreSQL和SQL Server。

有总体的例子清单吧?

Dapper有三个总体位于测试工程的测试套件。

何人在用这么些?

Stack Overflow正值选用Dapper。

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:Dapper简易教程,net平台性能很不错的轻型ORM类D

关键词: