要在对象中列出的多重映射字符串,dapper

时间:2016-07-12 10:07:43

标签: c# mysql 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; }
}

因此,从日历中,我得到了所有元组的名称,会议室容量和目的列表,其目的是为了给定房间。我的查询是这样的:

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 mrmrp.room_id=@Id)
         a
     WHERE meeting_room.id=@Id    

此查询的输出是一组元组,仅在目的上有所不同,例如

| 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我得到一个异常,如果我保留它我只得到一个空(null)对象。我相信这不是太难,我似乎无法得到我的“欧洲之夜”。

最好的问候

1 个答案:

答案 0 :(得分:0)

Dapper的多重映射功能并非真正针对此一对多风格的映射而设计。 This SO Answer显示了一种单独加载房间和用途的方法,然后在代码中加入它们。 QueryMultiple示例在一个数据库往返时做了类似的事情。