我正在尝试退回包含属于该订单的订单项的订单。目前,即使有多个订单项,也只会返回一项。那是因为我打电话给
FirstOrDefault()
变量result有两条记录。两者之间唯一的区别是 SKU 和数量。
如何映射行项目?订单对象包含 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();
}
通过使用多重映射,您无法管理 1:N 关系,就像您试图通过一个订单包含多个订单项来做到的那样。
如果您感兴趣,请在此处查看更多信息:多重映射将单行映射到多个对象
您有两种选择来解决问题:
更改存储过程以返回两个结果集:
1 for the order
、1 with "n" associated line items
,然后读取每个结果集(Dapper 支持此功能:处理多个结果集到 Order 和 LineItem 对象中。
更改存储过程以返回 JSON,该 JSON 返回带有嵌套行项目的订单。然后您可以将 JSON 转换为您的对象。
如果您使用的是 SQL Server 2016,那么我强烈建议使用第二个选项,然后它本身就支持 JSON。