2015-04-16 184 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