Dapper的Query的方法提供了多个泛型重载可以帮助我们实现导航属性的查询

1对1

  1. public class Employees4List
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public string Mobile { get; set; }
  6. public Department4Employees Department { get; set; }
  7. }
  8. public class Role4Employees
  9. {
  10. public int Id { get; set; }
  11. public string Name { get; set; }
  12. }
  13. IEnumerable<Employees4List> GetEmployees()
  14. {
  15. var sql = $@"
  16. select #e.[Id],#e.[Name],#e.[Mobile]
  17. ,#depart.id,#depart.name
  18. from dbo.T_Eemploye #e
  19. left join [dbo].[T_Department] #depart on #depart.id = #e.Department
  20. ";
  21. using (var conn = GetReadConnection())
  22. {
  23. var list = conn.Query<Employees4List, Department4Employees, Employees4List>(sql, (e, d) =>
  24. {
  25. e.Department = d;
  26. return e;
  27. });
  28. return list;
  29. }
  30. }

1对n

但是如果职工类中加入这样一个属性呢 ? public List<Role4Employees> Role { get; set; }

  1. public class Employees4List
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public string Mobile { get; set; }
  6. public List<Role4Employees> Role { get; set; }
  7. public Department4Employees Department { get; set; }
  8. }
  9. public class Role4Employees
  10. {
  11. public int Id { get; set; }
  12. public string Name { get; set; }
  13. }
  14. public class Department4Employees
  15. {
  16. public int Id { get; set; }
  17. public string Name { get; set; }
  18. }

之前看到过这样一个方式,但是它是不能像我们想象的那样工作,这里如果一个Eemploye有多个角色,那就和原始的sql语句一样,他会产生重复的记录

  1. IEnumerable<Employees4List> GetEmployees()
  2. {
  3. var sql = $@"
  4. select #e.[Id],#e.[Name],#e.[Mobile]
  5. ,#depart.id,#depart.name
  6. ,#role.id,#role.name
  7. from dbo.T_Eemploye #e
  8. left join [dbo].[T_Department] #depart on #depart.id = #e.Department
  9. left join [dbo].[T_Role] #role on #role.value & #e.role = #role.value
  10. ";
  11. using (var conn = GetReadConnection())
  12. {
  13. var list = conn.Query<Employees4List, Department4Employees, Role4Employees, Employees4List>(sql,(e, d, r) =>
  14. {
  15. e.Department = d;
  16. e.Role.Add(r);
  17. return e;
  18. });
  19. return list;
  20. }
  21. }

正确的方式是使用Slapper.Automapper,这个包需要独立安装

  1. IEnumerable<Employees4List> GetEmployees()
  2. {
  3. var sql = $@"
  4. select #e.[Id],#e.[Name],#e.[Mobile]
  5. ,#role.id Role_Id,#role.name Role_Name
  6. ,#depart.id Department_Id,#depart.name Department_Name
  7. from dbo.T_Eemploye #e
  8. left join [dbo].[T_Role] #role on #role.value & #e.role = #role.value
  9. left join [dbo].[T_Department] #depart on #depart.id = #e.Department
  10. ";
  11. using (var conn = GetReadConnection())
  12. {
  13. var dynamic = conn.Query<dynamic>(sql);
  14.  
  15. Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Employees4List), new List<string> { "Id" });
  16. Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Role4Employees), new List<string> { "Id" });
  17. Slapper.AutoMapper.Configuration.AddIdentifier(typeof(Department4Employees), "Id");
  18.  
  19. var list = (Slapper.AutoMapper.MapDynamic<Employees4List>(dynamic) as IEnumerable<Employees4List>).ToList();
  20.  
  21. return list;
  22. }
  23. }

通过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. :app:compileDebugJavaWithJavac

    org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: ...

  2. 云主机IO性能测试

    1:数据读取速度 ucloud云主机最低224.8MB/S,最高508.8MB/S,平均410.7MB/S     阿里云主机最低17.4MB/S, 最高189.6MB/S,平均170.6MB/S   ...

  3. 【C#】C#中方法(函数)的类型有哪些

    目录结构: contents structure [+] 构造函数 引用类型的构造函数 值类型的构造函数 析构函数 析构函数的使用 析构函数和Dispose()方法的区别 操作符重载 转化操作符方法 ...

  4. JVM源码分析之Object.wait/notify实现(转载)

    最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提供一个稳定的基础,Object作为java中所有对象的基类,其存在的价值不言而喻,其中wait和notify方法的实现多线程协作提供了保证. ...

  5. CentOS7安装chrony替代ntp同步时间

    Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确.它由两个程序组成:chronyd和chronyc:chronyd是一个后台运行的守护进程,用于调整内核中运 ...

  6. sublime text 3 安装卸载插件和取消启动检查更新

    1.Perferences->Package Contro,输入install 调出 Install Package 选项并回车 2.安装相应的插件 2.点击首选项–设置(用户) 3.卸载插件 ...

  7. 一次性将多个文件夹批处理压缩成多个.rar

    超级简单.不用自己写.bat批处理. 1. 打开winrar,选中所有要压缩的文件夹 2. 菜单->commands->add files to achive 3. 选中Files tab ...

  8. Asp.Net WebApi swagger使用教程

    swagger简介 别名:丝袜哥 功能:用于生产api文档 swagger安装 Nuget搜索swagger,然后安装Swashbuckle swagger使用 生成api的xml文档 webapi项 ...

  9. CentOS 上开启 BBR 加速

    BBR 算法需要 Linux 4.9 及以上的内核支持,所以想要使用该方式的需要先升级内核版本. 在 Cent OS 7 上的 Linux 内核是 3.10, 使用 uname -r 查看内核版本 [ ...

  10. mysql解除死锁状态

    方案一: 1.查看是否有锁表 show OPEN TABLES ; 2.查询进程(如果你有SUPER权限,你可以看到所有线程.否则,只能看到你自己的线程) show processlist; 3.杀死 ...