以前用习惯了ef,现在的公司的基础框架是用大名鼎鼎的google开源类库Dapper为基础开发,但是还没有完善。在开发过程中被多表联查折腾的很惨。
在此记录下自己摸着石头过河实验出的结果。
新建连个类,对应数据库中新建两个表
public class Profile { public int ID { get; set; } public string Name { get; set; } public string Phone { get; set; } public string Address { get; set; } public ExtraInfo Extra { get; set; } } public class Topic { public int ID { get; set; } public string Title { get; set; } public DateTime CreateDate { get; set; } public string Content { get; set; } public int UID { get; set; } public int TestColum { get; set; } public string Name { get; set; } public Profile Author { get; set; } public Attachment Attach { get; set; } }
对应与项目中的代码如下:
var sql =@"select * from Topic as T inner join Profile P on T.UID = P.ID";
var list = conn.Query<Topic, Profile, Topic>( sql, (T, P) => {return T; }, null, null, true, "ID");
相信大家对上边的代码再熟悉不过,很简单,关键就在与splitOn这个参数,到底是什么意思?翻遍了博客园的帖子,都是一些蜻蜓点水的尝试,而且都是抄袭的统一个人的。
splitOn到底是什么意思?这个参数中的值是用逗号分隔的,用来划分查询中的字段是属于哪个表,也就是查询结构映射到哪个实体。
上边的代码中的splitOn
是ID,运行时,会从查询结果所有字段列表的最后一个字段开始进行匹配,一直到找到Id这个字段(大小写忽略),找到的第一个ID字段匹配
Topic类的ID属性,那么从ID到最后一个字段都属于
Topic,ID以前的字段都被影射到
Profile
,通过
(T, P) => {return T; },
把两个类的实例解析出来。
尝试了很多次,看了n多的文章,最终在一篇老外的论坛中看到有人请教,有人这么教的。果断如获至宝的实验一下,成功了。实际通过mssql2008监视工具查询,此查询两次产讯数据,不知道是什么原因,可能是懒加载的原因,后续在研究。