Reputation: 499
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
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