Joe Defill
Joe Defill

Reputation: 499

Map to nested object using Dapper

I have an object that has 2 lists of classes.

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

And here's how the objects should be mapped:

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

What's a way to map the above query to the nested class?

Upvotes: 1

Views: 4735

Answers (1)

Selim Yildiz
Selim Yildiz

Reputation: 5370

Give it a go:

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;

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

Update:

Thanks, @Palle Due for pointing out. You should also add splitOn parameter based on first column of tables as follows:(Assuming first column of Order_Items is order_item_id and Order_Shipment is order_shipment_id)

 splitOn: "order_id, order_item_id, order_shipment_id"

See: Correct use of Multimapping in Dapper

Upvotes: 2

Related Questions