第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
上一篇博文中我们快速的介绍了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应该注意的坑相关推荐
- 轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
上一篇博文中我们快速的介绍了dapper的一些基本CURD操作,也是我们manipulate db不可或缺的最小单元,这一篇我们介绍下相对复杂 一点的操作,源码分析暂时就不在这里介绍了. 一:t ...
- 2020年博客日报第二篇|总有些人影响着你,反思+工作总结
博客日报篇章二 触发心灵的东西才能不断激励自我提升 (想起了领导对于日报的强调,一定要对于今天的感悟,不是"流水账") 一.开篇前言 昨天晚上规划了今天的工作任务,目标狠明确,狠明 ...
- mysql遍历resultset_java中ResultSet遍历数据操作
1.查找数据库中表的列名 String sql = "select *from tblmetadatainfo"; ResultSet rs = MySqlHelper.execu ...
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- 初学Python——文件操作第二篇
前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...
- 数据库应用程序开发基础篇—— .NET中SQL Server数据库的操作C#篇之一
数据库应用程序开发基础篇-- .NET中SQL Server数据库的操作C#篇之一 写在前面:前面介绍了数据库系统的基本概念,SQl语句基本使用方法,接下来通过学习具体语言和具体数据库结合的应用开发来 ...
- 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- 看山聊并发:如果非要在多线程中使用 ArrayList 会发生什么?(第二篇)
你好,我是看山. 前面写过一篇文章 <如果非要在多线程中使用 ArrayList 会发生什么?>,有读者反馈,Java 11 代码已经修复,还会出现 null 元素. 为了便于理解,当时只 ...
- python对excel某一列去重-「总结篇」Python中所有的Excel操作技巧
原标题:「总结篇」Python中所有的Excel操作技巧 Python对于Excel的操作是多种多样的,掌握了相关用法就可以随心所欲的操作数据了! 操作xls文件 xlrd(读操作): import ...
最新文章
- SAP 物料分类账常用表
- English debate sample motion
- Office SharePoint Server 2007 中的 Workflow
- PAT (Advanced Level) 1010 Radix(二分+模拟)
- 许家印深夜主持集团营销大会:恒大全国楼盘全线7折!
- 大数据分析平台具备怎样的功能
- oracle11.2.0.4使用impdp导入时报错:ORA-39083 ORA-00439
- [转载] hexo categories和tags页面不显示解决办法
- 汉字区位码转换为“汉字ASCII码“
- Matlab线型、标记符号、颜色
- Linux发行版Ubuntu教程
- 【SpringBoot+Vue】前后端分离项目之图片上传与下载
- ONF与天地互连共同成立开放SDN推广中心(OSPC)
- 下一代云计算架构,VMware要占“半壁江山”
- 经典《飞机大战》游戏,难道你不想自己动手开发一个嘛(附源码免费下载)
- 拼多多校招----最大乘积(python)
- 图片服务器FastDFS的安装及使用
- CDH 6.3.2 安装(一)
- 产品经理(12)#竞品调研
- 在北京开运输公司需要注意什么