以前用習慣了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監視工具查詢,此查詢兩次產訊數據,不知道是什么原因,可能是懶加載的原因,后續在研究。
