Dapper multi mapeo de muchas a muchas relaciones

c# dapper sql

Pregunta

Estoy tratando de mapear una relación NN con dapper utilizando como DB MySQL. Esto es más o menos el código.

        var query = new StringBuilder();
        query.Append("SELECT O.Id, O.Email, O.Status, P.Name FROM Owners AS O");
        query.Append(" INNER JOIN OwnerPets OP ON OP.OwnerId = O.Id");
        query.Append(" INNER JOIN Pets AS P ON P.Id = OP.PetId");
        query.Append(" WHERE O.Status = @Status;");

        using (var dbConnection = CreateConnection())
        {
            return dbConnection.Query<Owner, IEnumerable<Pet>, Owner>(query.ToString(), (owner, pets) =>
            {
                owner.Pets = pets.ToList();
                return Owner;
            }, new { Status = status }, splitOn: "OwnerId, PetId");
        }

La consulta funciona bien en un cliente SQL, pero cuando ejecuto el código anterior obtengo esta excepción: "Al usar las API de mapeo múltiple, asegúrese de configurar el parametro splitOn si tiene claves que no sean Id. Nombre del parámetro: splitOn"

¿Es posible mapear una relación NN teniendo una tabla intermedia (OwnerPets)? ... Si es así ... ¿qué estoy haciendo mal?

Respuesta aceptada

No estoy seguro de si puede conseguir que Dapper devuelva los datos directamente como lo desee, pero puede cargar los datos de forma tal que exista una relación uno a uno entre Propietarios y Mascotas y luego seguirlos con la consulta LINQ para agrupar a las Mascotas. para cada propietario

return dbConnection
    .Query<Owner, Pet, Owner>(
        query,
        (owner, pet) =>
        {
            owner.Pets = owner.Pets ?? new List<Pet>();
            owner.Pets.Add(pet);
            return owner;
        },
        new { Status = status },
        splitOn: "Name"
    )
    .GroupBy(o => o.Id)
    .Select(group =>
    {
        var combinedOwner = group.First();
        combinedOwner.Pets = group.Select(owner => owner.Pets.Single()).ToList();
        return combinedOwner;
    });


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é