2014-06-10 93 views
0

我想使用Dapper將扁平行映射到簡單的父/子對象。
我不確定如何做到這一點,下面是一個簡單的表格,查詢和類映射到的例子。Dapper將單條記錄映射到父母和孩子

項目表
ID,名稱status_a,status_b,STATUS_C

狀態表
ID,描述

查詢

select 
    prj.id, 
    prj.name, 
    a.description, 
    b.description, 
    c.description 
from project prj 
join status a on prj.status_a = a.id 
join status b on prj.status_b = b.id 
join status c on prj.status_c = c.id 

類映射到

class Project 
{ 
    public string Name { get; set; } 
    public Status Status { get; set; } 
} 

class Status 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    public string C { get; set; } 
} 

回答

1

它看起來像你需要使用多映射。

sqlConnection.Query<Project, Status, Project>(yourQueryString, 
    (project, status) => { 
      project.Status = status; 
      return project; 
    }, 
    splitOn: "description"); 

或類似的東西。我沒有測試過這個代碼,但這是基本的想法。

sqlConnection.Query基本上告訴Dapper你的sql查詢將返回兩個對象(Project和Status)。這是通過通用參數中的前兩種類型推斷的。第三個(項目)告訴Dapper這個Dapper調用應該最終返回一個Project。

第一個參數將成爲您的查詢,就像正常一樣。 第二個參數是一些將從您的查詢中接收項目和狀態的函數,並期望您返回一個項目對象。在這裏,我們只是將狀態分配給項目的狀態屬性。

splitOn可讓您在精緻小巧的「在什麼時候在SQL查詢做‘項目’對象結束和‘狀態’對象開始。

select 
prj.id, 
prj.name, 
a.description, 
b.description, 
c.description 
from project prj 
join status a on prj.status_a = a.id 
join status b on prj.status_b = b.id 
join status c on prj.status_c = c.id 

你可以看到你的項目對象在PRJ結束。名稱和狀態對象從a.description開始。