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实现一对多的更多相关文章

  1. Dapper实现一对多对象关系聚合导航属性

    领域对象:Game(游戏), Room(游戏群),两者一对多的关系,SQL语句中会用到JOIN public class Game : AggregateRoot { public string Ta ...

  2. 三层架构的一点理解以及Dapper一对多查询

    1.首先说一下自己对三层架构的一点理解 论坛里经常说会出现喜欢面相对象的写法,所以使用EF的,我个人觉得他俩没啥关系,先别反对,先听听我怎么说吧. 三层架构,基本都快说烂了,但今天还是说三层架构:UI ...

  3. Dapper 一对多查询 one to many

    参考文档:Dapper one to many Table public class Person { public int Id { get; set; } public string Name { ...

  4. Dapper.NET——轻量ORM

    Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...

  5. Dapper.Net 应用

    Dapper应用 1.Dapper是什么 Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用 ...

  6. ORM系列之三:Dapper

    目录 1.Dapper 简介 2.Dapper 安装 3.Dapper 使用 Dapper简介 Dapper是一个轻量级的ORM框架,短小精悍,正如其名.对于小项目,使用EF,NHibernate这样 ...

  7. Dapper

    前一段做一个技术分享关于dapper的,现在再总结一下,也好长时间没有更新博客了--,用到的东西 Dapper.AutoFac .AutoMapper.FluentValidation: 下面说一下D ...

  8. Dapper学习笔记(1)-开始

    Dapper是一款开源的轻量级ORM工具,源代码下载地址为https://github.com/StackExchange/dapper-dot-net,其具有以下特点: 1.Dapper是一个轻型的 ...

  9. 轻型的ORM类Dapper

    Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,主要是IDbConnection的扩展方法,编译后就40K的一个很小的dll.官方站点http://code.google.c ...

随机推荐

  1. PL/SQL学习笔记之游标

    一:游标 Oracle会创建一个上下文区域,用于处理SQL语句,其中包含需要处理的语句.处理结果等等. 游标指向这一上下文的区域. PL/SQL通过控制游标在上下文区域移动,来获取SQL语句的结果信息 ...

  2. 转发:查看centos中的用户和用户组

    1.用户列表文件:/etc/passwd/ 2.用户组列表文件:/etc/group 3.查看系统中有哪些用户: cut -d : -f 1 /etc/passwd 4.查看可以登录系统的用户: ca ...

  3. linux每日命令(39):lsof命令

    lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...

  4. 《软件测试自动化之道》读书笔记 之 底层的Web UI 测试

    <软件测试自动化之道>读书笔记 之 底层的Web UI 测试 2014-09-28 测试自动化程序的任务待测程序测试程序  启动IE并连接到这个实例  如何判断待测web程序完全加载到浏览 ...

  5. 批处理命令学习笔记——Start命令

    Start 命令 启动另一个窗口运行指定的程序或命令,所有的DOS命令和命令行程序都可以由start命令来调用. 语法:START ["title"] [/Dpath] [/I] ...

  6. github建库不成功,不能用SVN上传

    说明(2017-12-7 11:37:35): 1. 之前用SVN向gihub提交代码没有一点问题,昨天新建了一个仓库,结果死活提交不上去,以为是SVN的问题,折腾了一天都没弄好. 2. github ...

  7. rtrim() 函数 从字符串的末端开始删除空白字符!

    例子 在本例中,我们将使用 rtrim() 函数从字符串右端删除字符: <?php $str = "Hello World!\n\n"; echo $str; echo rt ...

  8. 如何在Excel中提取小数点后面的数字?

    Excel中,如果某个单元格中包含一个带小数,要用公式提取该数值小数点后面的数字,例如A1单元格中包含一个数值“59178.68”,在B1单元格中输入下面的公式: =RIGHT(A1,LEN(A1)- ...

  9. OllyScripts 0.92帮助文档

    -------------------------------Olly脚本插件v0.92 制作: SHaG文档汉化:ZMWorm[CCG][TT]E-Mail:TranslationTeam[at]1 ...

  10. mysql中update+select

    mysql中不支持嵌套查询后更新操作. 但是可以使用inner join来解决自身的更新问题,参考如下例子: update hera_job a inner join( ),'"') as ...