Slapper帮助Dapper实现一对多
Dapper的Query的方法提供了多个泛型重载可以帮助我们实现导航属性的查询
1对1
public class Employees4List
{
public int Id { get; set; }
public string Name { get; set; }
public string Mobile { get; set; }
public Department4Employees Department { get; set; }
}
public class Role4Employees
{
public int Id { get; set; }
public string Name { get; set; }
}
IEnumerable<Employees4List> GetEmployees()
{
var sql = $@"
select #e.[Id],#e.[Name],#e.[Mobile]
,#depart.id,#depart.name
from dbo.T_Eemploye #e
left join [dbo].[T_Department] #depart on #depart.id = #e.Department
";
using (var conn = GetReadConnection())
{
var list = conn.Query<Employees4List, Department4Employees, Employees4List>(sql, (e, d) =>
{
e.Department = d;
return e;
});
return list;
}
}
1对n
但是如果职工类中加入这样一个属性呢 ? public List<Role4Employees> Role { get; set; }
public class Employees4List
{
public int Id { get; set; }
public string Name { get; set; }
public string Mobile { get; set; }
public List<Role4Employees> Role { get; set; }
public Department4Employees Department { get; set; }
}
public class Role4Employees
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Department4Employees
{
public int Id { get; set; }
public string Name { get; set; }
}
之前看到过这样一个方式,但是它是不能像我们想象的那样工作,这里如果一个Eemploye有多个角色,那就和原始的sql语句一样,他会产生重复的记录
IEnumerable<Employees4List> GetEmployees()
{
var sql = $@"
select #e.[Id],#e.[Name],#e.[Mobile]
,#depart.id,#depart.name
,#role.id,#role.name
from dbo.T_Eemploye #e
left join [dbo].[T_Department] #depart on #depart.id = #e.Department
left join [dbo].[T_Role] #role on #role.value & #e.role = #role.value
";
using (var conn = GetReadConnection())
{
var list = conn.Query<Employees4List, Department4Employees, Role4Employees, Employees4List>(sql,(e, d, r) =>
{
e.Department = d;
e.Role.Add(r);
return e;
});
return list;
}
}
正确的方式是使用Slapper.Automapper,这个包需要独立安装
IEnumerable<Employees4List> GetEmployees()
{
var sql = $@"
select #e.[Id],#e.[Name],#e.[Mobile]
,#role.id Role_Id,#role.name Role_Name
,#depart.id Department_Id,#depart.name Department_Name
from dbo.T_Eemploye #e
left join [dbo].[T_Role] #role on #role.value & #e.role = #role.value
left join [dbo].[T_Department] #depart on #depart.id = #e.Department
";
using (var conn = GetReadConnection())
{
var dynamic = conn.Query<dynamic>(sql); Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Employees4List), new List<string> { "Id" });
Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Role4Employees), new List<string> { "Id" });
Slapper.AutoMapper.Configuration.AddIdentifier(typeof(Department4Employees), "Id"); var list = (Slapper.AutoMapper.MapDynamic<Employees4List>(dynamic) as IEnumerable<Employees4List>).ToList(); return list;
}
}
通过AddIdentifier和AddIdentifier来识别外键是1对1还是1对n,需要注意的是这里需要对字段取别名,怎么取呢?
新的名称以在c#类中字段名称+下划线+导航类的字段名称
比如说Employees4List中有一个属性Role要做1对n查询,通过AddIdentifiers方法指明需要转换的类型名称和主键名称,其次在sql语句中通过
Role_Id和Role_Name来取别名,下划线前面的Role来自Employees4List的 Role属性,下划线后面的 Id 和 Name来自 Role4Employees
Slapper帮助Dapper实现一对多的更多相关文章
- Dapper实现一对多对象关系聚合导航属性
领域对象:Game(游戏), Room(游戏群),两者一对多的关系,SQL语句中会用到JOIN public class Game : AggregateRoot { public string Ta ...
- 三层架构的一点理解以及Dapper一对多查询
1.首先说一下自己对三层架构的一点理解 论坛里经常说会出现喜欢面相对象的写法,所以使用EF的,我个人觉得他俩没啥关系,先别反对,先听听我怎么说吧. 三层架构,基本都快说烂了,但今天还是说三层架构:UI ...
- Dapper 一对多查询 one to many
参考文档:Dapper one to many Table public class Person { public int Id { get; set; } public string Name { ...
- Dapper.NET——轻量ORM
Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...
- Dapper.Net 应用
Dapper应用 1.Dapper是什么 Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用 ...
- ORM系列之三:Dapper
目录 1.Dapper 简介 2.Dapper 安装 3.Dapper 使用 Dapper简介 Dapper是一个轻量级的ORM框架,短小精悍,正如其名.对于小项目,使用EF,NHibernate这样 ...
- Dapper
前一段做一个技术分享关于dapper的,现在再总结一下,也好长时间没有更新博客了--,用到的东西 Dapper.AutoFac .AutoMapper.FluentValidation: 下面说一下D ...
- Dapper学习笔记(1)-开始
Dapper是一款开源的轻量级ORM工具,源代码下载地址为https://github.com/StackExchange/dapper-dot-net,其具有以下特点: 1.Dapper是一个轻型的 ...
- 轻型的ORM类Dapper
Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,主要是IDbConnection的扩展方法,编译后就40K的一个很小的dll.官方站点http://code.google.c ...
随机推荐
- Android GUI之View测量
在上篇文章(http://www.cnblogs.com/jerehedu/p/4607599.html#gui)中,根据源码探索了View的绘制过程,过程有三个主要步骤,分别为测量.布局.绘制.系统 ...
- MySQL 大致测试更新时间
1:需求:把一个2千万条数据的一个表,随机更新其中的二十行需要大致多久? DROP TABLE IF EXISTS test20; CREATE TABLE test20( id INT AUTO_I ...
- [javase学习笔记]-6.2 类与对象的关系
这一节我们来看一下类与对象之间的关系. 我们学习java语言,目的就是用java语言对现实生活中的事物进行描写叙述.那么我们如何来描写叙述呢.这就引出了类,我们在实际实现时,是通过类的形式来体现的. ...
- oracle decode()函数的参数原来可以为sql语句!
1.情景展示 判断某个字段的值,如果以APP开头,需查询APP表里对应的数据:如果是以JG开头,就查询机构对应的表. 2.原因分析 如果使用CASE WHEN THEN或者IF ELSIF 太麻烦 ...
- pycharm怎么设置代码自动补齐
代码补全功能在PyCharm上是一流的.默认情况下PyCharm会在你输入的时候给出建议: 由于此功能可有点耗电,你可以通过选择File→Power Save Mode来禁用它.您仍然可以通过Cont ...
- iOS中自动登录的设计
1.//这是登录控制器页面 - (void)viewDidLoad { [super viewDidLoad]; //lt.iSNextAutoLogin是单利中的一个属性,用来保存下次是否自动登录 ...
- 百度「Web 前端研发部」面试过程和常见问题 可能会采用哪些方法来面试 STAR 面试法 喜欢什么样的面试者 喜欢问的问题
http://segmentfault.com/a/1190000002498800 在他们的github上看到的,收藏一下备用.看完觉得还有很多要努力的地方. FEX 的面试过程 我们一般会有 3 ...
- Winform开发框架之通用Windows摄像头调用拍照--SNF快速开发平台3.3-Spring.Net.Framework
今天做了一个windows系统下调用摄像头.进行开启.关闭.拍照.设置等等功能演示. 进行源码贡献,欢迎大家下载使用 一.DEMO效果如下: 二.DEMO演示代码如下: using SNF.Utili ...
- LeetCode: First Missing Positive 解题报告
First Missing Positive Given an unsorted integer array, find the first missing positive integer. For ...
- CLOS网络的无阻塞条件
交换单元及网络 模拟信号数字化和时分复用基础 交换单元模型基本交换单元 交换网络 2.1模拟信号数字化和分时复用基础 模拟信号是指在是和幅度数值上连续变化的信号 数字信号是指在时间和幅度取值上离散的编 ...