【问题标题】:Map to nested object using Dapper使用 Dapper 映射到嵌套对象
【发布时间】:2020-10-11 15:04:23
【问题描述】:

我有一个包含 2 个类列表的对象。

public class Order
{
    int order_id;
    double amount;
    List<order_item> order_items;
    List<order_shipment> order_shipments;
}

以下是对象的映射方式:

SELECT * FROM Orders o
INNER JOIN Order_Items i ON i.order_id = o.order_id
INNER JOIN Order_Shipments s ON s.order_id = o.order_id

有什么方法可以将上述查询映射到嵌套类?

【问题讨论】:

  • 你看过 dapper multi-mapper 吗?
  • 那是一个单独的库吗?我不熟悉它
  • @JoeDefill 我已经添加了答案,请检查。

标签: c# dapper


【解决方案1】:

试一试:

var lookup = new Dictionary<int, Order>();
conn.Query<Order, order_item, order_shipment, Order>(@"
        SELECT o.*,i.*,s.* FROM Orders o
        INNER JOIN Order_Items i ON i.order_id = o.order_id
        INNER JOIN Order_Shipments s ON s.order_id = o.order_id 
    ", (o, i, s) => {
        Order order;
        
        if (!lookup.TryGetValue(o.order_id, out order))
              lookup.Add(o.order_id, order = o);
        
        order.order_items = order.order_items ?? new List<order_item>();
        order.order_items.Add(i);
         
        order.order_shipments = order.order_shipments ?? new List<order_shipment>();
        order.order_shipments.Add(s);
        
        return order;
    }).AsQueryable();
    
var result = lookup.Values;

见:How do I map lists of nested objects with Dapper

更新:

感谢 @Palle Due 指出。您还应该根据表格的第一列添加splitOn参数,如下所示:(假设Order_Items的第一列是order_item_idOrder_Shipmentorder_shipment_id

 splitOn: "order_id, order_item_id, order_shipment_id"

见:Correct use of Multimapping in Dapper

【讨论】:

  • 你不缺splitOn: "order_id"吗?默认是在名为id 的列上拆分,所以Query 不知道如何拆分。
  • 抱歉,我无法完全理解您所说的内容。请您详细说明一下好吗?
  • Query 需要一些帮助将结果数据拆分为 Orders、order_items 和 order_shipments。您可以通过添加 splitOn 参数来说明哪些列构成拆分。您尚未添加该参数,这很好,但前提是所有拆分列都命名为 id。见此链接:stackoverflow.com/questions/7472088/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2014-12-30
  • 2016-10-14
  • 1970-01-01
  • 2020-09-27
  • 2013-08-01
相关资源
最近更新 更多