C#的dapper使用-程序员宅基地

技术标签: git  数据库  大数据  

Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀。你又觉得ORM省时省力,这时Dapper 将是你不二的选择。

为什么选择Dapper

  1. 轻量。只有一个文件(SqlMapper.cs),编译完成之后只有120k(好象是变胖了)
  2. 速度快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
  3. 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
  4. 可以映射一对一,一对多,多对多等多种关系。
  5. 性能高。通过Emit反射IDataReader的序列队列,来快速的得到和产生对象,性能不错。
  6. 支持FrameWork2.0,3.0,3.5,4.0,4.5

Dapper的安装

方法一:使用NuGet安装
打开visual studio的项目,依次点击工具NuGet包管理器管理解决方案的NuGet程序包; 

再点击浏览搜索dapper点击搜索结果中的Dapper勾选项目选择安装

解决方案管理器中点击项目查看引用,如果有Dapper,说明安装成功。 

 

方法二:直接在官网[2]下载源代码,加入项目。这种方法哈希君没有试,不过可以参考链接Dapper快速学习

 

Dapper的基本用法

插入操作

将一个对象person插入数据库的方法如图。 

插入代码文本如下。@Name的意思是自动将person里的Name值绑定上去。

public static int Insert(Person person)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", person);
    }
}

批量插入:

/// <summary>
/// 批量插入Person数据,返回影响行数
/// </summary>
/// <param name="persons"></param>
/// <returns>影响行数</returns>
public static int Insert(List<Person> persons)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("insert into Person(Name,Remark) values(@Name,@Remark)", persons);
    }
}
删除操作
public static int Delete(Person person)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("delete from Person where id=@ID", person);
    }
}

public static int Delete(List<Person> persons)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("delete from Person where id=@ID", persons);
    }
}
修改操作
public static int Update(Person person)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("update Person set name=@name where id=@ID", person);
    }
}

public static int Update(List<Person> persons)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Execute("update Person set name=@name where id=@ID", persons);
    }
}
查询操作
/// <summary>
/// 无参查询所有数据
/// </summary>
/// <returns></returns>
public static List<Person> Query()
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
    return connection.Query<Person>("select * from Person").ToList();
    }
}

/// <summary>
/// 查询指定数据
/// </summary>
/// <param name="person"></param>
/// <returns></returns>
public static Person Query(Person person)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        return connection.Query<Person>("select * from Person where id=@ID",person).SingleOrDefault();
}
}

Dapper的复杂操作

查询的In操作
/// <summary>
/// In操作
/// </summary>
public static List<Person> QueryIn()
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = "select * from Person where id in @ids";
        //参数类型是Array的时候,dappper会自动将其转化
        return connection.Query<Person>(sql, new { ids = new int[2] { 1, 2 }, }).ToList();
    }
}

public static List<Person> QueryIn(int[] ids)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = "select * from Person where id in @ids";
        //参数类型是Array的时候,dappper会自动将其转化
        return connection.Query<Person>(sql, new { ids }).ToList();
    }
}
多语句操作

为此我们引入以下Book类,同样在数据库里设置这个表。

public class Book
{
    public int ID { get; set; }
    public int PersonID { get; set; }
    public string BookName { get; set; }
}
/// <summary>
/// 多语句操作
/// </summary>
public static void QueryMultiple()
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = "select * from Person; select * from Book";
        var multiReader = connection.QueryMultiple(sql);
        var personList = multiReader.Read<Person>();
        var bookList = multiReader.Read<Book>();
        multiReader.Dispose();
    }
}
Join操作

我们是面向对象编程,所以一个对象里面会有许多其他子对象,这个子对象里面又有其自己的子对象,这种关系在数据库里的表示就是外键。
比如我们有一本书book,它有主人person,book是一个对象,主人又是一个对象。

public class BookWithPerson
{
    public int ID { get; set; }
    public Person Pers { get; set; }
    public string BookName { get; set; }
}
我们自然想要一个方法把数据库里复杂的外键关系转成我们需要的对象BookWithPerson,所有我们需要的信息都存在里面,取数据的时候只要找这个对象取数据就行了,比如我们需要一本书的主人的姓名,我们只需要bookWithPerson.Pers.Name。如果是一对多的关系我们用数组,如果是多对多我们加一层mapping。
现在我们想根据书的ID查询书的信息,包括主人信息。那么
public static BookWithPerson QueryJoin(Book book)
{
    using (IDbConnection connection = new SqlConnection(connectionString))
    {
        var sql = @"select b.id,b.bookName,p.id,p.name,p.remark
                        from Person as p
                        join Book as b
                        on p.id = b.personId
                        where b.id = @id;";
        var result = connection.Query<BookWithPerson, Person, BookWithPerson>(sql,
        (bookWithPerson, person) =>
        {
            bookWithPerson.Pers = person;
            return bookWithPerson;
        },
        book);
      //splitOn: "bookName");
      return (BookWithPerson)result;
  }
}
中,Query的三个泛型参数分别是 委托回调类型1委托回调类型2返回类型。形参的三个参数分别是 sql语句map委托对象参数。所以整句的意思是先根据sql语句查询;同时把查询的person信息赋值给bookWithPerson.Pers,并且返回bookWithPerson;book是对象参数,提供参数绑定的值。
最终整个方法返回BookWithPerson,这样我们所需要的所有信息就有了。
摘自于:https://www.jianshu.com/p/c4ca2989d26a

转载于:https://www.cnblogs.com/flywong/p/9666963.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33690367/article/details/94567425

智能推荐

18.6 负载均衡集群介绍 18.7 LVS介绍 18.8 LVS调度算法 18.9/18.10 LVS NAT模式搭建-程序员宅基地

文章浏览阅读67次。一、负载均衡集群介绍负载均衡集群:简单地说就是让多台服务器均衡地去承载压力。实现负载均衡的开源软件有:LVS,keepalived,haproxy,nginx等其中相对于(网络OSI七层模型),LVS属于四层,Nginx属于七层,haproxy既可以认为四层,也可以认为是七层。keepalived的负载均衡功能其实就是lvslvs这种4层的负载均衡是可以分发出80外的其他端口通..._18.6 负载均衡集群介绍 18.7 lvs介绍 18.8 lvs调度算法 18.9/18.10 lvs nat模式搭

有哪些好看的CNN模型画法?-程序员宅基地

文章浏览阅读2.2k次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达编辑:忆臻本文仅作为学术分享,如果侵权,会删文处理机器学习算法与自然语言处理报道有哪些好看的CNN模型画法?作者:bi..._cnn模型图

Android Studio基础工作流程-xml布局文件如何调用显示_layout xml 怎么加载到view r 怎么取到-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏8次。说起安卓开发,很多小伙伴在刚开始入门的时候会有些云里雾里,觉得很混乱,这很正常,大多数是因为不太清楚安卓开发的基本流程,以及各个文件之间是怎样去相互作用的。我会在这篇文章里面向你介绍一下Android studio工作的基本流程,很基础很基础的那种。_layout xml 怎么加载到view r 怎么取到

星载/机载遥感导航论文合集-程序员宅基地

文章浏览阅读657次,点赞5次,收藏12次。采用现有无人车导航系统进行农作物育种表型信息的监测与采集时,存在因育种小区数量较多导致的导航目标点人工测量工作量大的问题,且育种田块不同于大田作物以A-B 线为基线的路径规划方法,无人车需要根据育种材料编号自动行进到某一指定位置进行作物表型信息采集。因此,为提高导航效率和降低人工劳动强度,本文基于无人机遥感对无人车的导航系统进行了研究。通过无人机获取玉米育种田的遥感影像并进行拼接和位置矫正,生成正射影像和数字地表模型(Digital Surface Model,DSM)。

asp.net mvc多条件+分页查询解决方案_.net core mvc+bootstrap 页面分页查询-程序员宅基地

文章浏览阅读7.8k次。开发环境vs2010css:bootstrapjs:jquery bootstrap paginator原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了MVC多条件+分页查询因为美工不是很好,所以用的是bootstrap前端框架,自己懒得写前端的分页控件,用的是bootstrap paginator分页控件。方式: _.net core mvc+bootstrap 页面分页查询

Springboot +spring security,OAuth2 四种授权模式概念_springbootsecurity oauth2-程序员宅基地

文章浏览阅读2.5k次。Springboot +spring security,OAuth2 四种授权模式概念_springbootsecurity oauth2

随便推点

万万没想到,次世代游戏建模行业现状这么惨_次时代3d建模师的缺口-程序员宅基地

文章浏览阅读466次。首先,3D游戏建模师,这个工作首先是个劳动密集的工作,当中不仅仅是建模,贴图,其中美术流程在时间上占了1/2。还有一半时间你是在做法线做低模做uv,这些工作完全是体力活,靠熟练度你可以做的比较好。而这些技术流程,本质上是为了妥协计算机机能不足,或者满足当世代游戏美术流程而产生的,随着计算机发展,这些流程会逐渐降低所占的比重。其次,3d建模处于整个游戏流程的末端环节,成为3d建模师,并不是可以完全了解整个游戏制作流程的,更多的乐趣来自于你依托于原画创建出了令人信服的3d角色后的成就感。再次,3d建模薪水回_次时代3d建模师的缺口

python关于组合数据类型_python组合数据类型-程序员宅基地

文章浏览阅读1.2k次。《python组合数据类型》由会员分享,可在线阅读,更多相关《python组合数据类型(73页珍藏版)》请在人人文库网上搜索。1、Python语言程序设计,第6章 组合数据类型,组合数据类型概述,序列类型,计算机不仅对单个变量表示的数据进行处理,更多情况,计算机需要对一组数据进行批量处理。一些例子包括: 给定一组单词python, data, function, list, loop,计算并输出每..._元组是包含0个或多个数据项的不可变序列

SAP EXCEL上传如何实现指定读取某一个sheet页(ALSM_EXCEL_TO_INTERNAL_TABLE)_raise_exception" saplalsmex" bzw. lalsmexu01 alsm_-程序员宅基地

文章浏览阅读630次,点赞8次,收藏10次。SAP EXCEL上传如何实现指定读取某一个sheet页(ALSM_EXCEL_TO_INTERNAL_TABLE)_raise_exception" saplalsmex" bzw. lalsmexu01 alsm_excel_to_internal_table

win10禁止google更新却在服务中找不到googleupdate,解决方案_服务里面没有谷歌更新服务-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏3次。前提:想要使现用chrome不更新,按照网上最多的教程是控制面板-管理工具-服务-找到“Google更新服务(Gupdate)"服务 项与“Google更新服务(Gupdatem)”服务项-选择“禁用”我安装的谷歌浏览器在服务中找不到googleupdate参考教程如下:手动方式:chrome禁止更新如何设置_怎么设置chrome不自动更新-win7之家命令行方式:https://jingyan.baidu.com/article/f3ad7d0f51c6bf09c3345bb0.htm_服务里面没有谷歌更新服务

python人工智能算法pdf_深度学习:人工智能算法(Deep Learning) PDF 高清版-程序员宅基地

文章浏览阅读822次。给大家带来的一篇关于人工智能相关的电子书资源,介绍了关于深度学习、人工智能算法方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小30.8 MB,Ian Goodfellow编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.7。内容介绍本书包括3 个部分:第1 部分介绍基本的数学工具和机器学习的概念,它们是深度学习的预备知识;第2 部分系统深入地讲解现今已成熟的深度学习方法和技术..._人工智能 算法 pdf

Opencontrail CentOS66编译全过程_centos6 ipfix-程序员宅基地

文章浏览阅读1.2k次。(一)VNC1 下载如下包 git clonehttps://github.com/Juniper/contrail-testhttps://github.com/Juniper/contrail-provisioninghttps://github.com/Juniper/contrail-fabric-utilshttps://github.com/Juniper/cont_centos6 ipfix