轻量级ORM框架Dapper应用五:使用Dapper实现Join操作
在这篇文章中,讲解如何使用Dapper使用Inner join的操作
1、新创建两张表:Users表和Product表
Users表定义如下:
CREATE TABLE [dbo].[Users](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[UserName] [varchar](16) NULL,
[Email] [varchar](32) NULL,
[Address] [varchar](128) NULL,
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] GO
Product表定义如下:
CREATE TABLE [dbo].[Product](
[ProductId] [int] IDENTITY(1,1) NOT NULL,
[ProductName] [varchar](16) NULL,
[Price] [decimal](8, 2) NULL,
[UserId] [int] NULL,
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] GO
查看Users表和Product表会发现两张表通过UserId外键关联起来,然后我们需要在Product实体类上面进行修改,添加一个User的实体属性,修改后的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DapperApplicationJoin.Model
{
public class Product
{
public int ProductId { get; set; } public string ProductName { get; set; } public User UserOwner { get; set; } public string Price { get; set; }
}
}
User实体类定义如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DapperApplicationJoin.Model
{
public class User
{
public int UserId { get; set; } public string UserName { get; set; } public string Email { get; set; } public string Address { get; set; }
}
}
2、Main方法定义如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using Dapper;
using DapperApplicationJoin.Model; namespace DapperApplicationJoin
{
class Program
{
static void Main(string[] args)
{
string conn = ConfigurationManager.ConnectionStrings["AppConnection"].ConnectionString;
using (IDbConnection connection = new SqlConnection(conn))
{
string sql = @"
select p.ProductName,p.Price,u.UserName,u.UserId,u.Email,u.Address
from Product as p
join Users as u
on p.UserId=u.UserId;
"; var result = connection.Query<Product, User, Product>(sql,
(product, users) =>
{
product.UserOwner = users; return product;
}, splitOn: "UserName");
var query = connection.Query(sql);
// 输出 使用动态类型
query.AsList().ForEach(p =>
{
Console.WriteLine("产品名称:" + p.ProductName + ",产品价格:" + p.Price + ",用户姓名:" + p.UserName);
});
} Console.ReadKey();
}
}
}
splitOn参数的含义:代码中的splitOn是UserName,运行时,会从查询结果所有字段列表的最后一个字段开始进行匹配,一直到找到UserName这个字段(大小写忽略无所谓),找到的第一个UserName字段匹配的Product类的UserName属性,那么从UserName到最后一个字段都属于Product,UserName以前的字段都被影射到Users,通过 (T, P) => {return T; },把两个类的实例解析出来。就实现了两个数据的解析,要不然dapper也不知道哪个是Product哪个是Users的属性。
除了可以使用上面的方法以外,还可以使用直接查询SQL语句的方式:
using (IDbConnection connection = new SqlConnection(conn))
{
string sql = @"
select p.ProductName,p.Price,u.UserName,u.UserId,u.Email,u.Address
from Product as p
join Users as u
on p.UserId=u.UserId;
";
var query = connection.Query(sql);
// 输出 使用动态类型
query.AsList().ForEach(p =>
{
Console.WriteLine("产品名称:" + p.ProductName + ",产品价格:" + p.Price + ",用户姓名:" + p.UserName);
});
}
运行结果如下:

示例代码下载地址:https://pan.baidu.com/s/1gfwA9d5
轻量级ORM框架Dapper应用五:使用Dapper实现Join操作的更多相关文章
- 轻量级ORM框架初探-Dapper与PetaPoco的基本使用
一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- 轻量级ORM框架Dapper应用一:Dapper安装
一.Dapper简介 Dapper是一款轻量级ORM框架,为解决网站访问流量极高而产生的性能问题而构造,主要通过执行TSQL表达式而实现数据库的CQRS. 如果你在项目中遇到性能访问问题,选择Dapp ...
- 分享自己写的基于Dapper的轻量级ORM框架~
1.说明 本项目是一个使用.NET Standard 2.0开发的,基于 Dapper 的轻量级 ORM 框架,包含基本的CRUD以及根据表达式进行一些操作的方法,目前只针对单表,不包含多表连接操作. ...
- C# 性能优化 之 秒表 Stopwatch。 Dapper一个和petapoco差不多的轻量级ORM框架
Sweet小马 小马同学的编程日记. C# 性能优化 之 秒表 Stopwatch. 生词解释:Diagnostics[,daɪəg'nɑstɪks] n.诊断学 using System.Diagn ...
- c# 轻量级ORM框架 实现(一)
发布一个自己写的一个轻量级ORM框架,本框架设计期初基于三层架构.所以从命名上来看,了解三层的朋友会很好理解. 设计该框架的目的:不想重复的写增删改查,把精力放到功能实现上. 发布改框架的原因:希望给 ...
- 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- 轻量级ORM框架——第一篇:Dapper快速学习
我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...
- 基于轻量级ORM框架Dapper的扩展说明
这里简单的介绍一下本人基于Dapper作的一些简单的扩展,供大家参考. 为何要使用这款框架,相信大家看到下面排名就清楚了 其实在各大网站上,我们大概都会看到这样的一个对比效果图,在超过500次poco ...
随机推荐
- 【LeetCode】146. LRU Cache
LRU Cache Design and implement a data structure for Least Recently Used (LRU) cache. It should suppo ...
- Fusion Tables 图层用于呈现 Google Fusion Tables 中包含的数据
Google Maps API 允许您使用 FusionTablesLayer 对象将 Google Fusion Tables 中包含的数据呈现为地图上的图层.Google Fusion Table ...
- python学习笔记013——内置函数dir()
1 描述 dir() 函数 不带参数时,返回当前范围内的变量.方法和定义的类型列表: 带参数时,返回参数的属性.方法列表. 如果参数包含方法__dir__(),该方法将被调用. 如果参数不包含__di ...
- 管道读写规则和Pipe Capacity、PIPE_BUF
一.当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止. O_NONBLOCK enable:read调用返回-1,errno值为EAGA ...
- Concurrency Managed Workqueue(三)创建workqueue代码分析
一.前言 本文主要以__alloc_workqueue_key函数为主线,描述CMWQ中的创建一个workqueue实例的代码过程. 二.WQ_POWER_EFFICIENT的处理 __alloc_w ...
- 敏捷转型中why与how的总结
敏捷转型參考框架: 为了成功顺畅地推行敏捷开发.下面将对整个敏捷转型參考框架作个整体说明.为企业进行敏捷转型提供基本方法參考.整个敏捷转型參考框架主要包括5个步骤,前两个步骤主要是回答 Wh y的问题 ...
- unity camera aspect
camera的aspect默认是与screen保持一致,可以通过脚本将其设为指定值,如下: using UnityEngine;using System.Collections; public cla ...
- 不停mysql服务添加从库的两种方式
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...
- 【Android】10.4 卡片视图
分类:C#.Android.VS2015: 创建日期:2016-02-19 一.简介 Android 从5.0开始包含了一个全新的卡片视图小部件,这个新的小部件默认就像一张带有圆角和轻微阴影的白色卡片 ...
- ny710 外星人的供给站
外星人的供给站 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本 ...