SELECT 全部 children
SELECT all with children
我有以下 类:
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;
}
}
}
我知道我可以 select 将我所有的订单 ID 值放入单独查询的集合中,然后 运行 在 foreach
循环中使用集合值作为参数,但我想知道 dapper 是否有更优雅的解决方案来返回我的所有订单,而不是只返回一个。
听起来您有一个 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();
}
有用吗?
我有以下 类:
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;
}
}
}
我知道我可以 select 将我所有的订单 ID 值放入单独查询的集合中,然后 运行 在 foreach
循环中使用集合值作为参数,但我想知道 dapper 是否有更优雅的解决方案来返回我的所有订单,而不是只返回一个。
听起来您有一个 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();
}
有用吗?