Est-ce possible avec Dapper?

dapper sql sql-server

Question

Si vous avez un objet Customer qui possède une propriété List<Orders> , comment pouvez-vous sélectionner les clients souhaités, puis appliquer les commandes pour ce client à la propriété List<Orders> pour chacun?

La seule façon dont je peux penser consiste à effectuer une boucle sur les clients et à accéder à la base de données N fois pour les commandes concernées contre ce client.

var sql = @"
select * from Customers
select * from Orders where CustomerId = @id";

using (var multi = connection.QueryMultiple(sql))
{
   var customers = multi.Read<Customer>();

   //Get orders for each result in customers and apply 
   //Customer.Orders property to result
   var orders = multi.Read<Order>().ToList();
} 

Réponse acceptée

Vous devez utiliser le multi-mapping. De la documentation Dapper:

var sql = 
@"select * from #Posts p 
left join #Users u on u.Id = p.OwnerId 
Order by p.Id";

var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post;});
var post = data.First();

post.Content.IsEqualTo("Sams Post1");
post.Id.IsEqualTo(1);
post.Owner.Name.IsEqualTo("Sam");
post.Owner.Id.IsEqualTo(99);

Dans votre code, les utilisateurs seront des clients et les commandes seront des messages.

Edit Je me rends compte que ce n'est pas exactement ce que vous voulez. Donc, dans votre cas, vous pouvez utiliser QueryMultiple, mais en faisant correspondre les enregistrements des deux listes avec linq, en évitant d’atteindre les Db N fois:

var sql = @"select * from Customers
            select * from Orders";

using (var multi = connection.QueryMultiple(sql))
{
   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
} 


foreach c in customers {
   c.Orders = (from rec in orders where rec.CustomerId == c.Id select rec).ToList()
}

Modifier le refactor pour de meilleures performances si vous avez plusieurs filtres dans Customers

 var customers = connection.Query<Customer>("select * from Customers 
     where blah, blah, blah, blah, .. ").ToList();

 var orders = connection.Query<Order>("select * from Order where CustomerID in @Ids",
     new { Ids = (from rec in customers select rec.Id).ToList()}).ToList();

foreach c in customers {
   c.Orders = (from rec in orders where rec.CustomerId == c.Id select rec).ToList()
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi