dapper学习地址:http://www.cnblogs.com/yankliu-vip/p/4182892.html#anchor2

上一篇, 提到Query<Test>查询的时候, 如果Test中包含自定义class, Dapper不会给自定义class完成映射, 而是直接给null, 其实是可以实现的, 答案就在下面的基本用法介绍中

提到用法, 首先是要实现CURD, 这里先介绍Read吧.

先上实体:

    public enum Gender
{
男 = 0,

} public class Tch_Teacher
{
public int Id { get; set; } public Gender Sex { get; set; } public string Name { get; set; } public bool IsDoublePosition { get; set; } public DateTime CreateDate { get; set; }
}
public class Tch_Contact
{
public int Id { get; set; } public int TId { get; set; } public string Phone { get; set; } public string QQ { get; set; } public string Weixin { get; set; }
}
public class TeacherInfo
{
public Tch_Contact Contact { get; set; } public Tch_Teacher Teacher { get; set; }
}

一、一对一映射

sql = "select Sex, Id, Name, CreateDate, No from tch_teacher limit 3;";
var list = conn.Query<Tch_Teacher>(sql);
Console.WriteLine(list.ToList().FirstOrDefault().Name);

一对一映射还是蛮简单的, 不需要解释了,  这种写法, 就是前面提到的, 如果Tch_Teacher里面有一个Tch_Contact类型的属性, 那么在映射的时候, 这个属性会直接赋值为null

二、一对多映射

sql = @"select a.Id, a.Sex, a.Name, a.CreateDate, a.No, b.Id, b.Phone, b.QQ, 
b.Weixin from tch_teacher a left join tch_contact b on a.Id = b.TId order by a.Id asc limit 3;"; //No这个字段, 在类中并没有
var list1 = conn.Query<Test, Tch_Contact, TeacherInfo>(sql, (a, b) =>
{
TeacherInfo tInfo = new TeacherInfo();
if (a != null)
{
tInfo.Teacher = a;
}
if (b != null)
{
tInfo.Contact = b;
}
return tInfo;
});
//}, null, null, true, "Id", null, null);

此时, 返回的 List<TeacherInfo> 中, Teacher 和 Contact 都是有值的, 而不是直接给null, 当然, TeacherInfo中, 还可以有别的字段, 比如 public int No {get;set;},

此时的No是能获取到值的. 其中的映射原理, 这里我就不再赘述了, 能看懂Dapper中一对一映射的原理, 一对多映射也就差不多了.

如果将 TeacherInfo类中Contact属性修改一下, 改成 List<Tch_Contact>类型, 那么怎样得到一个按 Tch_Teacher 分组的数据呢?

通常情况下, 会想到两种办法:

一种是上面这种办法, 先得到全部数据, 然后通过GroupBy方法, 进行分组, 也能得到那种分组数据, 但那并不理想, 这种方法我就不贴了.

  1. 得到的数据, 并不是我们想要的那种格式数据, 虽然也是分组的数据.

  2. 有重复项. Tch_Teacher并没有得到去除重复的功能. 虽然分了组, 但是每组中的数据, Tch_Teacher仍然是重复的.

另一种, 就是通过一个中间变量来获取, 方法如下:

sql = @"select a.Id, a.Sex, a.Name, a.CreateDate, a.No, b.Id, b.Phone, b.QQ, b.Weixin
from tch_teacher a left join tch_contact b on a.Id = b.TId order by a.Id asc limit 6;";
var infos = new Dictionary<int, TeacherInfo>();
var list1 = conn.Query<Test, Tch_Contact, TeacherInfo>(sql, (a, b) =>
{
TeacherInfo tInfo;
if (!infos.TryGetValue(a.Id, out tInfo))
{
tInfo = new TeacherInfo();
tInfo.Contact = new List<Tch_Contact>();
tInfo.Teacher = a;
infos.Add(a.Id, tInfo);
}
if (b != null)
{
infos[a.Id].Contact.Add(b);
}
return infos[a.Id];
});

使用字典项, 在其中进行一个规整操作, 去除重复的 Tch_Teacher信息, 把Tch_Contact进行规整分组. 而且, 得到的结果, 就直接是想要的结果

public class TeacherInfo
{
public List<Tch_Contact> Contact { get; set; } public Tch_Teacher Teacher { get; set; }
}  

dapper 学习的更多相关文章

  1. Dapper学习(三)之其他用法

    这里说的其他用法,是指 Async,Buffered,Transaction,Stored Procedure. 1. 首先 dapper支持异步 ExecuteAsync, QueryAsync, ...

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

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

  3. .net Dapper 学习系列(1) ---Dapper入门

    目录 写在前面 为什么选择Dapper 在项目中安装Dapper 在项目中使用Dapper 在项目中使用Dapper 进行单表增删改数据操作 总结 写在前面 Dapper 是一款轻量级ORM架构.为解 ...

  4. Dapper学习(一)之Execute和Query

    Dapper是一个用于.NET的简单的对象映射,并且在速度上有着轻ORM之王的称号. Dapper扩展IDbConnection,提供有用的扩展方法来查询数据库. 那么Dapper是怎样工作的呢? 总 ...

  5. .net Dapper 学习系列(2) ---Dapper进阶

    目录 写在前面 前期准备 Dapper 单表批量添加 在Dapper 多表查询 在Dapper 调用存储过程 在Dapper 使用QueryMultiple进行多表查询 在Dapper 使用事务进行多 ...

  6. Dapper学习笔记(一)

    https://github.com/StackExchange/dapper-dot-net Dapper是对IDbConnection的扩展,需要使用Dapper提供的扩展只需要把SqlMappe ...

  7. Dapper学习笔记(4)-事务

    Dapper中对事务的处理也非常简单,如下代码所示: private void DapperTransaction() { using (IDbConnection con = OpenConnect ...

  8. Dapper学习笔记(2)-链接引用

    在研究Dapper源码时发现Dapper NET45类库中的SqlMapper.cs文件前面有个蓝色的箭头图标,发现在Dapper NET45文件夹下根本不存在SqlMapper.cs文件,其文件属性 ...

  9. Dapper学习 - Dapper.Rainbow(三) - Read

    前面已经介绍了新增/修改/删除了, 接下来介绍一下Rainbow的Read方法. 一.Read -- Rainbow原生 1. 先看测试代码 var conStr = ConfigurationMan ...

随机推荐

  1. 一个Woker类,当id和name相同时,系统判断两个工人是相等的,打印工人对象时显示“工人:id和name”。

    public class Worker { private int id; private String name; private double salary; public boolean equ ...

  2. 面向对象的JavaScript

    多态 多态背后的思想是将"做什么"和"谁去做,怎样去做"分离开来,也就是将"不变的事物"与"可变的事物"分离开来. 其最 ...

  3. 利用反射模拟一个spring的内部工作原理

    这个简单的案例是实行了登录和注册的功能,没有链接数据库.  在bean中id 是唯一的,id和name的区别在于id不能用特殊字符而name可以用特殊字符,比如:/-\.... package com ...

  4. VisualSVN-5.1.4补丁原创发布

    VisualSVN-5.1.4补丁原创发布 VisualSVN-5.1.4Patch.rar  VisualSVN-5.1.4官方安装包.rar

  5. C语言-预估校正法求常微分方程

    #include<stdio.h> #include<math.h> #define n 14 int main(){ double a = 0.0, b = 1.4,h,m= ...

  6. 如果Python中有很多换行,可以选择使用"""..."""表示多行内容

    举例:>>> print("""... ... ... ... ... ... ... ... ''')... fdfd""&quo ...

  7. SharePoint 2013 CSOM 对象模型属性包

     博客地址:http://blog.csdn.net/FoxDave 虽说是翻译,但是并没什么翻译的,主要内容就是说有一些能通过Server API配置的Site/Web属性在CSOM中找不到,其 ...

  8. Intent之前的对象传递与fragment传递数据

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

  9. css3动画之背景颜色的自动切换

    因为不同浏览器内核的不同所以会产生浏览器兼容性问题 <!DOCTYPE html> <html> <head> <meta charset='utf-8'/& ...

  10. 第五章 搭建S3C6410开发板的测试环境

    在PC上可以开发Linux驱动,重新编译成ARM架构的Linux驱动模块,但最后还是要在开发板上进行测试.目前最流行的是基于三星S3C6410 ARM11架构的开发板,很多厂商在其基础上进行了扩展,开 ...