Cadena de multimapping para listar en el objeto, apuesto

c# dapper mysql

Pregunta

Soy nuevo en Dapper y estoy tratando de entender cómo se mapean las cosas. Tengo la siguiente estructura de base de datos:

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 |

La tabla 'calendario' es muy parecida a una cuenta. Puede tener varias salas de reuniones asociadas. Una sala de reuniones puede tener múltiples propósitos, que es la situación de mi pregunta. Necesito tener un objeto como este:

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

Así que desde el calendario, obtengo el nombre, meeting_room, la capacidad y la lista de propósitos de todas las tuplas con un propósito para la habitación dada. Mi consulta es así:

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    

El resultado de esta consulta es un conjunto de tuplas, que difieren solo en el propósito, por ejemplo

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

Por lo tanto, la sala de reuniones "Charmander", tiene una capacidad de 6 personas, y se puede utilizar para 3 propósitos. Debería asignarse al objeto como (si hubiera tenido un constructor simple):

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

Mi consulta dapper es como:

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

Si elimino splitOn recibo una excepción, y si la guardo solo obtengo un objeto vacío (nulo). Estoy seguro de que no es demasiado difícil, parece que no puedo obtener mi momento de "eurika".

Atentamente

Respuesta aceptada

La característica de multimapping de Dapper no está realmente diseñada para este mapeo de estilo One to Many. Esta respuesta SO muestra una forma de cargar las salas y los propósitos por separado y luego unirlos en el código. El ejemplo QueryMultiple hace algo similar con una ida y vuelta de base de datos.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué