我尝试使用属于订单的订单项返回订单。目前,即使有多个订单项,也只返回一个订单项。那是因为我打电话给FirstOrDefault()
变量结果有两条记录。两者之间的唯一区别是SKU和数量。
如何映射lineitems?订单对象包含一个LineItem列表,我需要添加所有这些列表。
public async Task<IOrder> ReadAsync(int orderId)
{
var result = await WithConnection(async c => await c.QueryAsync<Order, LineItem, Order>("_Orders_LineItems_ReadByOrderID",
(order, lineitem) =>
{
if (order.LineItems == null) order.LineItems = new List<ILineItem>();
order.LineItems.Add(lineitem);
return order;
}, new { orderId }, commandType: CommandType.StoredProcedure, splitOn: "LineItemID"));
return result.FirstOrDefault();
}
答案 0 :(得分:0)
通过使用多个映射,您无法管理1:N关系,因为您尝试通过让一个订单包含多个订单项来实现。
如果您有兴趣,可以在此处获取更多信息:https://medium.com/dapper-net/multiple-mapping-d36c637d14fa
您有两种方法可以解决问题:
1)更改存储过程以返回两个结果集:1表示订单,1表示“n”行,带有关联的行项,然后读取每个结果集(Dapper支持此功能:{{3} })到Order和LineItem对象。
2)更改存储过程以返回返回带有嵌套行项目的订单的JSON。然后,您可以将JSON转换为您的对象。
我的强烈建议是第二个选项,如果您使用的是SQL Server 2016,那么本机支持JSON。