sql:

SELECT *
FROM users;
SELECT *
FROM posts;
SELECT *
FROM Posts p
LEFT JOIN Users u ON u.Id= p.OwnerId
ORDER BY p.Id

结果集:

 
代码:
string sql =@"select * from Posts p
left join Users u on u.Id = p.OwnerId
Order by p.Id";
PostWithConstructor[] data = connection.Query<PostWithConstructor,UserWithConstructor,PostWithConstructor>(sql,(post, user)=>{ post.Owner= user;return post;}).ToArray();
解析:
Query的方法签名:
publicstaticIEnumerable<TReturn>Query<TFirst,TSecond,TReturn>(
#if CSHARP30
thisIDbConnection cnn,string sql,Func<TFirst,TSecond,TReturn>map,object param,IDbTransaction transaction, bool buffered,string splitOn,int? commandTimeout,CommandType? commandType
#else
thisIDbConnection cnn,string sql,Func<TFirst,TSecond,TReturn>map,object param =null,IDbTransaction transaction =null, bool buffered =true,string splitOn ="Id",int? commandTimeout =null,CommandType? commandType =null
#endif
)
IDbConnection的扩展方法,泛型:<TFirst,TSecond,TReturn>传入sql,Func委托:Func<TFirst,TSecond,TReturn> 实例代码中为:
  1. (post, user)=>{ post.Owner= user;return post;}
意思是,通过第一个和第二个类型得出返回类型对象。本例中TFirst-> PostWithConstructor, TSecond-> UserWithConstructor, TReturn-> PostWithConstructor
 
看一下结果:
注意下TFirst,TSecond的顺序,以及sql连表的顺序,换成右链接:
连表的顺序和传入的顺序非常重要;
这里注意一个问题:这个结果集的字段和实体的属性名称不相同,那是怎么映射的?如果有同名的属性怎么去处理?
我们注意到返回的结果集有重名字段,重名字段Id是对应不同的表的,用select * 这样可以把不同表的字段全部取出来。同时注意了,数据库表中的字段和实体Model里的属性名并不一致,其实他们是根据Model实体的构造函数进行区分的,我们可以看到这两个model都有构造函数:
 
dapper用结果集列名作区分,如何区分哪几列是一张表呢?dapper规定了分割字段,按分割的字段名进行对列的分割,默认的分割字段名为:Id,可以手动指定,基于这个原因就有了另外一个规定:分割字段必须是这个表的第一个字段。对于如下表设计就会报错。
dapper现在可以将结果集5列进行区分为两个表了,这时候对应哪个Model就要看传入TFirst,TSecond的顺序。注意一下PostWithConstructor的构造函数的owerid参数,这个参数在构造函数中并未使用,但是也标明了它,因为根据分割字段“Id"区分出给PostWithConstructor实体这三个:Id,OwnerId,[Content]字段。所以必须要在构造函数中有这三个字段的匹配。即:System.Int32 Id, System.Int32 OwnerId, System.String Content,不区分大小写。

Dapper使用方法:dapper-dot-net/Tests/Tests.cs解析(1)方法:TestMultiMapWithConstructor的更多相关文章

  1. .NET中常用的几种解析JSON方法

    一.基本概念 json是什么? JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是一种轻量级的数据交换格式,是存储和交换文本信息的语法. ...

  2. 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用

    反射的概念 反射: Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活 ...

  3. 开源且功能强大的C# 扩展方法类库Pure.Ext,包含1000+个拓展方法 (支持.Net Framework和.Net Core)

    先上地址 Github: https://github.com/purestackorg/pure.ext Gitee: https://gitee.com/purestack/pure.ext 扩展 ...

  4. Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求 方法 实现输出大写英文字母表的功能,printLowerca

    #34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void ...

  5. 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)

    反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法)   创建Delegate (1).Delegate.CreateDelegate(Type, ...

  6. 用JQuery中的Ajax方法获取web service等后台程序中的方法

    用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...

  7. JQ绑定事件(1.9已经废除了live()等绑定事件方法,on()方法是官方推荐的绑定事件的一个方法)

    本文来源:http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法. $(selector).on(ev ...

  8. C# 解析js方法,并调用js方法

    本文转载:http://www.cnblogs.com/StudyLife/archive/2013/03/11/2953516.html 本文不是基于B/S的 后台调用前台js方法,而是给你一段js ...

  9. python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法

    一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...

随机推荐

  1. HDU 1160 FatMouse's Speed (sort + dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 给你一些老鼠的体重和速度,问你最多需要几只可以证明体重越重速度越慢,并输出任意一组答案. 结构体 ...

  2. C++ 类的静态成员详细讲解[转]

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  3. 转载:DIV+CSS有可能遇到的问题

    [总结]DIV+CSS有可能遇到的问题 一.超链接访问过后hover样式就不出现的问题? 被点击访问过的超链接样式不在具有hover和active了,解决方法是改变CSS属性的排列顺序: L-V-H- ...

  4. 网络虚拟化技术 TUN/TAP MACVLAN MACVTAP

    TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设备是如何工作的:

  5. 【转】HTTP HEAD

    原文出自:http://kb.cnblogs.com/page/92320/ HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议.HTTP协议采用 ...

  6. HTML第四天学习笔记

    今天老师教了下无序列表和有序列表,虽然并没有,同时做了个随堂练习: <html> <head> <title>随堂练习00</title> <me ...

  7. FlashPaper 使用经验之谈

    李志海  20101229  QQ:76855049 CSDN:资源下载地址:http://lizhihai_99.download.csdn.net/ http://download.csdn.ne ...

  8. 解决ArcGIS Android Could not find class 'com.esri.android.map.MapView'问题

    环境win7 64bit sp1,eclipse 4.2.1 ,android API 16,ADT 23.0.2,arcgis android sdk 10.2.4 从arcgis-android- ...

  9. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  10. 数据结构复习:直接插入排序与二分插入排序的C++实现

    1.直接插入排序 直接插入排序的过程可以理解为一个固定长度的数组被分为两个集合,即已排序集合和未排序. 开始时已排序集合为空,而未排序集合即为整个数组.当排序开始后插入一个对象,已排序集合元素数目加1 ...