2016-07-12 28 views
0

我全都是Dapper的新手,我試圖讓我的頭腦知道它是如何映射事物的。我有以下數據庫結構:將多字符串字符串列入對象中,dapper

calendar 
| Id | Name | 

meeting_room 
| Id | Calendar_id | Capacity | 

meeting_room_purpose 
| id | Name | Description | 

meeting_room_meeting_room_purpose 
| id | room_id | purpose_id | 

'日曆'表非常像一個帳戶。它可以有多個與之關聯的會議室。會議室可以有多種目的,這是我的問題的困境。我需要有一個這樣的對象:

class MeetingRoom { 
    public string Name { get; set; } 
    public int Capacity { get; set; } 
    public List<string> Purpose { get; set; } 
} 

所以從日曆中,我得到的名字,meeting_room容量和用途從與給定的房間有目的的所有元組的列表。我的查詢是這樣的:

SELECT 
    calendar.id as CalendarId, 
    calendar.name as name, 
    meeting_room.capacity as capacity, 
    purpose 
FROM calendar 
LEFT JOIN meeting_room ON meeting_room.calendar_id=calendar.id 
INNER JOIN 
    (SELECT 
     meeting_room_purpose.name as purpose 
    FROM 
     meeting_room_purpose 
    INNER JOIN meeting_room_meeting_room_purpose mrmrp ON 
       meeting_room_purpose.id=mrmrp.purpose_id 
       AND [email protected]) 
     a 
    WHERE [email protected]  

這個查詢的輸出是一組元組,它們只是用途不同,

| CalendarId |  name  | capacity |  purpose  | 
     53   Charmander   6   Internal Meetings 
     53   Charmander   6   Marketing Meetings 
     53   Charmander   6   Sales Meetings 

因此,會議室「Charmander」,可容納6人,可用於3個目的。它應該映射到對象(有它有一個簡單的構造函數):

new MeetingRoom("Charmander", 6, new List<string>(){"Internal Meetings", "Marketing Meetings", "Sales Meetings"); 

我短小精悍的查詢是:

_connection.Query<MeetingRoom, string, MeetingRoom>(sql, 
    (room, purpose) => { 
     room.Purpose = purpose; return room; 
    }, 
    new { Id = query.Id }, splitOn: "id, purpose").SingleOrDefault(); 

如果我刪除splitOn我得到一個異常,如果我把它我只是得到一個空的(空)對象。我相信這不是太難,我似乎無法得到我的「eurika」時刻。

問候

回答

0

精緻小巧的multimapping功能是不是真的爲此設計的一對多樣式映射。 This SO Answer展示了一種分別加載房間和目的的方法,然後在代碼中加入它們。示例QueryMultiple用一個數據庫往返進行類似的事情。

相關問題