要在 object 中列出的多重映射字符串,小巧玲珑
Multimapping string to list in object, 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 |
'calendar' table 很像一个帐户。它可以有多个与之关联的会议室。会议室可以有多种用途,这是我问题的困境。我需要这样的 object:
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 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 个目的。它应该映射到 object 为(如果它有一个简单的构造函数):
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)object。我敢肯定这并不难,我只是似乎无法获得我的“eurika”时刻。
此致
Dapper 的多映射功能并不是真正为这种一对多样式映射设计的。 This SO Answer shows a way to load the rooms and purposes separately then join them in code afterward. The QueryMultiple 示例对一次数据库往返执行类似的操作。
我是 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 |
'calendar' table 很像一个帐户。它可以有多个与之关联的会议室。会议室可以有多种用途,这是我问题的困境。我需要这样的 object:
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 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 个目的。它应该映射到 object 为(如果它有一个简单的构造函数):
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)object。我敢肯定这并不难,我只是似乎无法获得我的“eurika”时刻。
此致
Dapper 的多映射功能并不是真正为这种一对多样式映射设计的。 This SO Answer shows a way to load the rooms and purposes separately then join them in code afterward. The QueryMultiple 示例对一次数据库往返执行类似的操作。