上一篇博文中我们快速的介绍了dapper的一些基本CURD操作,也是我们manipulate db不可或缺的最小单元,这一篇我们介绍下相对复杂

一点的操作,源码分析暂时就不在这里介绍了。

一:table sql

为了方便,这里我们生成两个表,一个Users,一个Product,sql如下:

<1> Users table

CREATE TABLE [dbo].[Users](

[UserID] [int] IDENTITY(1,1) NOT NULL,

[UserName] [varchar](50) NULL,

[Email] [varchar](100) NULL,

[Address] [varchar](100) NULL,

CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED

(

[UserID] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) ON [PRIMARY]

<2> Product table

CREATE TABLE [dbo].[Product](

[ProductID] [int] IDENTITY(1,1) NOT NULL,

[ProductName] [varchar](220) NULL,

[ProductDesc] [varchar](220) NULL,

[UserID] [int] NULL,

[CreateTime] [datetime] NULL,

CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED

(

[ProductID] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) ON [PRIMARY]

二:in操作

很多时候我们在manipulate table的时候,或多或少的都会用到 ”in关键字”,比如:我要找到User表中Email in ('5qq.com','8qq.com')的

Users record。。。

static void Main(string[] args)

{

var connection = new SqlConnection("Data Source=.;Initial Catalog=Datamip;Integrated Security=True;MultipleActiveResultSets=True");

var sql = "select * from Users where Email in @emails";

var info = connection.Query<Users>(sql, new { emails = new string[2] { "5qq.com", "7qq.com" } });

}

看了上面的操作,是不是很简单,只要我们的参数类型是Array的时候,dappper会自动将其转化。。。

三:多条sql一起执行

有时候我们会想在一条sql中灌入很多的snippet sql,然后让其一起执行,此时让我想起了一个操作,我会在db中load data的时候会写到

select ... from marketing where  id in (....); select .... from eventmarketing where in (...)类似这样的语句,然后进行结果合并,这篇

为了方便演示,在User上做一个*操作,在Product上做一个* 操作,比如下面这样:

static void Main(string[] args)

{

var connection = new SqlConnection("Data Source=.;Initial Catalog=Datamip;Integrated Security=True;MultipleActiveResultSets=True");

var sql = "select * from Product; select * from Users";

var multiReader = connection.QueryMultiple(sql);

var productList = multiReader.Read<Product>();

var userList = multiReader.Read<Users>();

multiReader.Dispose();

}

四:多表join操作

不管sql写的多么好或者多么烂,接触一个月还是接触到十年,都必然跑不了多表查询,那么在多表查询上dapper该如何使用呢???比如

说我要找到2015-12-12之后的商品信息和个人信息,很显然这是一个多表查询,可以先来看一下users和product的关系。

可以发现其实他们有一个外键关系,然后我们在Product Entity上做一下小修改,将Users作为Product的一个entity property。。。

public class Product

{

public int ProductID { get; set; }

public string ProductName { get; set; }

public string ProductDesc { get; set; }

public Users UserOwner { get; set; }

public string CreateTime { get; set; }

}

有了这些储备,我们大概就可以写出如下的sql。

static void Main(string[] args)

{

var connection = new SqlConnection("Data Source=.;Initial Catalog=Datamip;Integrated Security=True;MultipleActiveResultSets=True");

var sql = @"select  p.ProductName,p.CreateTime,u.UserName

from Product as p

join Users as u

on p.UserID = u.UserID

where p.CreateTime > '2015-12-12'; ";

var result = connection.Query<Product, Users, Product>(sql,

(product, users) =>

{

product.UserOwner = users; return product;

});

}

从错误信息中可以看到:当你使用multi-mapping的时候要确保设置了splitOn参数,除了Id。。。从这句话中好像也看不出什么名堂,也就是说

除了Id,你都需要设置SplitOn参数,好吧,这是逼着哥哥看源代码。。。。看看SplitOn到底是个什么样的鸟玩法。。。然后我从Call Stack往上

面找,发现了非常”至关重要“的一段话。

然来splitOn就是Dapper对DataReader进行”从右到左“的扫描,这样就可以从sequent中获取到一个subsequent,然后遇到设置的splitOn

就停止。。。然来是这样,哈哈。。。这回我就知道了,将splitOn设置为”userName“就好了。。。比如

static void Main(string[] args)

{

var connection = new SqlConnection("Data Source=.;Initial Catalog=Datamip;Integrated Security=True;MultipleActiveResultSets=True");

var sql = @"select  p.ProductName,p.CreateTime,u.UserName

from Product as p

join Users as u

on p.UserID = u.UserID

where p.CreateTime > '2015-12-12'; ";

var result = connection.Query<Product, Users, Product>(sql,

(product, users) =>

{

product.UserOwner = users; return product;

},splitOn: "UserName");

}

当然如果你觉得我上面说的太啰嗦了,注意事项还tmd的多,又是泛型,又是Lambda的。。。你也可以不指定这些具体Type,而默认使用

dynamic也是可以的,比如下面这样:

五:支持存储过程

对于存储过程,也是一个不得不说的话题,我们的dapper同样也是可以执行的,只需要在Query中的CommandType中标记一下当前就是一个

StoredProcedure就八九不离十了,比如现在在Users表上创建一个简单的StoredProcedure。

USE [Datamip]

GO

/****** Object:  StoredProcedure [dbo].[sp_GetUsers]    Script Date: 09/02/2016 09:14:04 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

Create proc [dbo].[sp_GetUsers]

@id int

as

begin

select * from Users where UserID = @id ;

end

在这里,我们需要向存储过程塞入一个@id参数,返回具体的Users EntityList,好了,下面再看一下Query如何构造。

static void Main(string[] args)

{

var connection = new SqlConnection("Data Source=.;Initial Catalog=Datamip;Integrated Security=True;MultipleActiveResultSets=True");

var info = connection.Query<Users>("sp_GetUsers", new { id = 5 },

commandType: CommandType.StoredProcedure);

}

搞定,感觉用Dapper是不是就这么简单,先就说到这里,希望对大家有帮助。

相关文章

  • Net下无敌的Micro ORM — Dapper

  • .NET Core 使用Dapper 操作MySQL

  • Dapper、Entity Framework 和混合应用

  • 第一篇:Dapper快速学习

原文地址:http://www.cnblogs.com/huangxincheng/p/5832281.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

第二篇:Dapper中的一些复杂操作和inner join应该注意的坑相关推荐

  1. 轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑

       上一篇博文中我们快速的介绍了dapper的一些基本CURD操作,也是我们manipulate db不可或缺的最小单元,这一篇我们介绍下相对复杂 一点的操作,源码分析暂时就不在这里介绍了. 一:t ...

  2. 2020年博客日报第二篇|总有些人影响着你,反思+工作总结

    博客日报篇章二 触发心灵的东西才能不断激励自我提升 (想起了领导对于日报的强调,一定要对于今天的感悟,不是"流水账") 一.开篇前言 昨天晚上规划了今天的工作任务,目标狠明确,狠明 ...

  3. mysql遍历resultset_java中ResultSet遍历数据操作

    1.查找数据库中表的列名 String sql = "select *from tblmetadatainfo"; ResultSet rs = MySqlHelper.execu ...

  4. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  5. 初学Python——文件操作第二篇

    前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...

  6. 数据库应用程序开发基础篇—— .NET中SQL Server数据库的操作C#篇之一

    数据库应用程序开发基础篇-- .NET中SQL Server数据库的操作C#篇之一 写在前面:前面介绍了数据库系统的基本概念,SQl语句基本使用方法,接下来通过学习具体语言和具体数据库结合的应用开发来 ...

  7. 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. 看山聊并发:如果非要在多线程中使用 ArrayList 会发生什么?(第二篇)

    你好,我是看山. 前面写过一篇文章 <如果非要在多线程中使用 ArrayList 会发生什么?>,有读者反馈,Java 11 代码已经修复,还会出现 null 元素. 为了便于理解,当时只 ...

  9. python对excel某一列去重-「总结篇」Python中所有的Excel操作技巧

    原标题:「总结篇」Python中所有的Excel操作技巧 Python对于Excel的操作是多种多样的,掌握了相关用法就可以随心所欲的操作数据了! 操作xls文件 xlrd(读操作): import ...

最新文章

  1. SAP 物料分类账常用表
  2. English debate sample motion
  3. Office SharePoint Server 2007 中的 Workflow
  4. PAT (Advanced Level) 1010 Radix(二分+模拟)
  5. 许家印深夜主持集团营销大会:恒大全国楼盘全线7折!
  6. 大数据分析平台具备怎样的功能
  7. oracle11.2.0.4使用impdp导入时报错:ORA-39083 ORA-00439
  8. [转载] hexo categories和tags页面不显示解决办法
  9. 汉字区位码转换为“汉字ASCII码“
  10. Matlab线型、标记符号、颜色
  11. Linux发行版Ubuntu教程
  12. 【SpringBoot+Vue】前后端分离项目之图片上传与下载
  13. ONF与天地互连共同成立开放SDN推广中心(OSPC)
  14. 下一代云计算架构,VMware要占“半壁江山”
  15. 经典《飞机大战》游戏,难道你不想自己动手开发一个嘛(附源码免费下载)
  16. 拼多多校招----最大乘积(python)
  17. 图片服务器FastDFS的安装及使用
  18. CDH 6.3.2 安装(一)
  19. 产品经理(12)#竞品调研
  20. 在北京开运输公司需要注意什么

热门文章

  1. 在SD/MMC卡中可读写的FAT文件系统
  2. Java程序员应该知道的10个Eclipse调试技巧
  3. 3G助推智慧医疗 看病将更加“智能化”
  4. 谈谈关于MVP模式中V-P交互问题
  5. 局域网一点通之组网、管网、用网1000问
  6. oracle express介绍
  7. 128位加密SSL证书
  8. C# 发出异步的Get请求
  9. 基于事件驱动架构构建微服务第2部分:领域对象和业务规则
  10. 【Blog.Core开源】快速升级.NET 6.0