2017-10-05 6 views
0

Au travail, nous envisageons d'utiliser Dapper. Dans la base de code existante, nos objets maître/détail sont chargés séparément. Généralement, cela signifie qu'une instruction sql est exécutée pour tous les enregistrements de base et qu'une instruction sql est exécutée par enregistrement de détail.Mapper les enregistrements maître/détail après les appels Dapper

Pour améliorer les performances et faciliter la transition, je voudrais faire 2 appels à l'aide Dapper et assembler les résultats ensemble:

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(); 
} 

Y at-il une méthode d'aide ou quelque chose dans Dapper que je peux utiliser pour remplacer le foreach. Dois-je utiliser quelque chose comme AutoMapper à la place? Ou existe-t-il un meilleur moyen d'y parvenir (que la boucle foreach) en utilisant la bibliothèque .NET?

Répondre

0

Vous pouvez essayer quelque chose comme ceci:

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; 
}); 
+0

Merci pour cela. En fin de compte, je veux réécrire notre code pour faire une seule instruction SELECT. Cependant, il y a un _lot_ de code qui doit être réécrit. Concevoir la manière la plus simple de réunir des données après plusieurs requêtes nous permettra d'introduire 'Dapper' avec le moins de friction possible – Mitkins