Registrar registros maestros / detalles después de llamadas Dapper

dapper data-modeling

Pregunta

En el trabajo, estamos considerando usar Dapper . En la base de código existente, nuestros objetos maestros / detalles se cargan por separado. Típicamente, esto significa que hay una instrucción sql ejecutada para todos los registros maestros y una instrucción sql ejecutada por registro detallado.

Para mejorar el rendimiento y facilitar la transición, me gustaría hacer 2 llamadas usando Dapper y unir los resultados:

public class Zoo
{
    Guid Id { get; set; }
    string Name { get; set;}
    IList<Monkey> Monkeys { get; set; }
}

public class Monkey
{
    Guid Id { get; set; }
    Guid ZooId { get; set; }
    string Name { get; set; }
    bool DeservesBanana { get; set; }
}

var sqlZoos = "SELECT * FROM Zoos"
var Zoos = connection.Query( sqlZoos )

var sqlMonkeys = "SELECT * FROM Monkeys"
var Zoos = connection.Query( sqlZoos )

foreach( var zoo in Zoos )
{
  zoo.Monkeys = Monkeys.Where( x => x.ZooId = zoo.Id ).ToList();
}

¿Hay algún método de ayuda o algo en Dapper que pueda usar para reemplazar el foreach ? ¿Debería usar algo como AutoMapper en AutoMapper lugar? ¿O hay una forma mejor de lograr esto (que el bucle foreach ) utilizando la biblioteca .NET?

Respuesta popular

Podrías probar algo como esto:

var zoos = new Dictionary<string, Zoo>();
var query = "SELECT * FROM Zoos LEFT OUTER JOIN Monkeys ON Monkeys.ZooId = Zoos.Id";

_connection.Query<Zoo, Monkey, Zoo>(query, (z, m) =>
{
    if (!zoos.TryGetValue(z.Id, out Zoo zoo))
        zoos.Add(z.Id, zoo = z);

    zoo.Monkeys.Add(m);
    return zoo;
});


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é