2015-04-16 2 views
0

У меня есть следующие классы:ВЫБРАТЬ все с детьми

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

Для возвращения одного заказа я использую этот метод (любой комментарий на нем также будет полезно):

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

Я знаю, что я может выбрать все значения идентификаторов моих заказов в коллекции по отдельному запросу и запустить описанный выше метод в цикле foreach, используя значения коллекции в качестве параметра, но мне интересно, имеет ли dapper более элегантное решение для возврата всех моих заказов, а не просто один.

+0

Можете уточнить, где находится этот список идентификаторов заказа? он не отображается в вопросе, поэтому я не могу прокомментировать; dapper * does * предлагает некоторые трюки с 'in' расширениями параметров списка/массива, например, которые могут быть полезны, но это зависит от контекста. Кроме того, вы должны, вероятно, параметризовать, что отредактировано –

+0

@MarcGravell, пожалуйста, сообщите, требуется ли дополнительная информация. – Yoav

ответ

0

Похоже, что у вас есть список или массив идентификаторов; щеголеватым поддерживает расширение параметров, что позволяет использовать с in, например:

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

Любое использование?

+0

У меня нет коллекции идентификаторов, но я могу создать ее в отдельном запросе. Я думал, что я мог бы избежать этого дополнительного запроса ... – Yoav

+0

@Yoav so ... Я смущен: если вы не хотите ограничивать набор идентификаторов ... просто заберите 'where' пункт ...? –

+0

Пробовал, но не смог заставить orderitems «подключиться» к каждому заказу. – Yoav

Смежные вопросы