2015-04-16 181 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; 
      } 
     } 
    } 

我知道我可以在一個單獨的查詢中將所有我的訂單Id值選擇到一個集合中,並使用集合值作爲參數在foreach循環中運行上述方法,但我不知道dapper是否具有更優雅的解決方案來返回所有訂單而不僅僅是一。

+0

你能澄清一下訂單ID列表嗎?它沒有在問題中顯示,所以我不能評論; dapper * does *提供了一些技巧,例如列表/數組參數的'in'擴展,這可能很有用 - 但它依賴於上下文。另外,你應該參數化 –

+0

@MarcGravell編輯,請告訴是否需要更多的信息 – Yoav

回答

0

這聽起來像你有一個ID列表或數組; dapper支持參數擴展,允許與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

我沒有一個id的集合,但我可以在一個單獨的查詢中創建一個。我在想的是,我可以避免這個額外的查詢... – Yoav

+0

@Yoav so ...我很困惑:如果你不想限制爲一組ID ...只是拿走'where'條款...? –

+0

嘗試過,但無法獲得訂單項以「連接」到每個訂單。 – Yoav