Dapper map multiple joins Sql Query

前端 未结 3 896
无人及你
无人及你 2021-02-01 11:14

I want to map complex object to dapper result from query which has two inner joins. I know we\'ve solution to map one inner join but I want to map two inner joins result.

<
3条回答
  •  执念已碎
    2021-02-01 11:47

    I don't know what is class 'OrderDetail' you don't provide it so I used Order class.
    This can also be done by QueryMultiple but because your question includes INNER JOIN I don't use it.

    public Dictionary GetOrderLookup()
    {
        var lookup = new Dictionary();
    
        const string sql = @"   SELECT  o.id,
                                        o.order_reference,
                                        o.order_status,
    
                                        ol.id,
                                        ol.order_id,
                                        ol.product_number,
    
                                        ols.id,
                                        ols.order_line_id,
                                        ols.size_name
                                FROM    orders_mstr o
                                JOIN    order_lines ol ON o.id = ol.order_id
                                JOIN    order_line_size_relations ols ON ol.id = ols.order_line_id";
    
        List orders = null;
        using (var connection = OpenConnection(_connectionString))
        {
            orders = connection.Query(sql, (order, orderLine, orderLizeSize) =>
            {
                orderLine.OrderLineSizes = new List { orderLizeSize };
                order.OrderLines = new List() { orderLine };
                return order;
            },
            null, commandType: CommandType.Text).ToList();
        }
    
        if (orders == null || orders.Count == 0)
        {
            return lookup;
        }
    
        foreach (var order in orders)
        {
            var contians = lookup.ContainsKey(order.id);
            if (contians)
            {
                var newLinesToAdd = new List();
                var existsLines = lookup[order.id].OrderLines;
                foreach (var existsLine in existsLines)
                {
                    foreach (var newLine in order.OrderLines)
                    {
                        if (existsLine.id == newLine.id)
                        {
                            existsLine.OrderLineSizes.AddRange(newLine.OrderLineSizes);
                        }
                        else
                        {
                            newLinesToAdd.Add(newLine);
                        }
                    }
                }
                existsLines.AddRange(newLinesToAdd);
            }
            else
            {
                lookup.Add(order.id, order);
            }
        }
    
        return lookup;
    }
    

提交回复
热议问题