SÉLECTIONNEZ tous avec des enfants

dapper sql

Question

J'ai les classes suivantes:

public class Order
{
    public Order()
    {
        OrderItems = new List<OrderItem>();
    }
    public int Id { get; set; }
    public string OrderName { get; set; }

    public int OrderStatusId { get; set; }
    public OrderStatus Status { get; set; }

    public List<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    public string ProductName { get; set; }
}

public class OrderStatus
{
    public int Id { get; set; }
    public string Description { get; set; }
}

Pour retourner une seule commande, j'utilise cette méthode (tout commentaire à ce sujet serait également utile):

Order GetOrder()
    {
        using (var con = GetConnection())
        {
            try
            {
                con.Open();
                string query =
@"SELECT * FROM [Order] JOIN OrderStatus ON [Order].OrderStatusId =  OrderStatus.Id WHERE [Order].Id =1;
SELECT * FROM OrderItem Where OrderId = 1";

                using (var multi = con.QueryMultiple(query))
                {
                    Order order = multi.Read<Order, OrderStatus, Order>
                    ((ord, ordStat) => { ord.Status = ordStat; return ord; })
                    .FirstOrDefault();

                    order.OrderItems = multi.Read<OrderItem>().ToList();
                    return order;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }

Je sais que je peux sélectionner toutes les valeurs Id de mes commandes dans une collection sur une requête distincte et exécuter la méthode ci-dessus dans une boucle foreach utilisant les valeurs de collection comme paramètre mais je me demande si Dapper a une solution plus élégante pour renvoyer toutes mes commandes au lieu d'un seul.

Réponse acceptée

Il semble que vous ayez une liste ou un tableau des identifiants; dapper soutient le développement des paramètres, ce qui permet une utilisation avec in , par exemple:

int[] ids = ...
string query =
@"SELECT * FROM [Order]
JOIN OrderStatus ON [Order].OrderStatusId =  OrderStatus.Id
WHERE [Order].Id in @ids;

SELECT * FROM OrderItem Where OrderId in @ids";

using (var multi = con.QueryMultiple(query, new { ids }))
{
    var orders = multi.Read<Order, OrderStatus, Order>
    ((ord, ordStat) => { ord.Status = ordStat; return ord; })
    .AsList();

    var orderItems = multi.Read<OrderItem>().ToLookup(x => x.OrderId);

    foreach(var order in orders) // pick out each order's items
        order.OrderItems = orderItems[order.Id].ToList();
}

Toute utilisation?



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