用Dapper映射子对象

时间:2018-03-09 19:32:55

标签: c# dapper

我尝试使用属于订单的订单项返回订单。目前,即使有多个订单项,也只返回一个订单项。那是因为我打电话给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();   
}

1 个答案:

答案 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。