使用 Dapper 映射子对象

问题描述 投票:0回答:1

我正在尝试退回包含属于该订单的订单项的订单。目前,即使有多个订单项,也只会返回一项。那是因为我打电话给

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();   
}
c# dapper
1个回答
1
投票

通过使用多重映射,您无法管理 1:N 关系,就像您试图通过一个订单包含多个订单项来做到的那样。

如果您感兴趣,请在此处查看更多信息:多重映射将单行映射到多个对象

您有两种选择来解决问题:

  1. 更改存储过程以返回两个结果集:

    1 for the order
    1 with "n" associated line items
    ,然后读取每个结果集(Dapper 支持此功能:处理多个结果集到 Order 和 LineItem 对象中。

  2. 更改存储过程以返回 JSON,该 JSON 返回带有嵌套行项目的订单。然后您可以将 JSON 转换为您的对象。

如果您使用的是 SQL Server 2016,那么我强烈建议使用第二个选项,然后它本身就支持 JSON。

© www.soinside.com 2019 - 2024. All rights reserved.