Saltar al contenido

Dapper map multiple joins Sql Query

Nuestros mejores investigadores han agotado sus depósitos de café, en su búsqueda día y noche por la solución, hasta que Alexandría halló la respuesta en Bitbucket y hoy la compartimos contigo.

Solución:

Hice lo mejor que pude y lo resolví.

Aquí está la solución más fácil y precisa según mi:

var lookup = new Dictionary();
            var lookup2 = new Dictionary();
            connection.Query(@"
                    SELECT o.*, ol.*, ols.*
                    FROM orders_mstr o
                    INNER JOIN order_lines ol ON o.id = ol.order_id
                    INNER JOIN order_line_size_relations ols ON ol.id = ols.order_line_id           
                    ", (o, ol, ols) =>
            
                OrderDetail orderDetail;
                if (!lookup.TryGetValue(o.id, out orderDetail))
                
                    lookup.Add(o.id, orderDetail = o);
                
                OrderLine orderLine;
                if (!lookup2.TryGetValue(ol.id, out orderLine))
                
                    lookup2.Add(ol.id, orderLine = ol);
                    orderDetail.OrderLines.Add(orderLine);
                
                orderLine.OrderLineSizes.Add(ols);
                return orderDetail;
            ).AsQueryable();

            var resultList = lookup.Values.ToList();

No sé qué es la clase ‘OrderDetail’, no la proporcionas, así que usé la clase Order.
Esto también se puede hacer QueryMultiple pero debido a que su pregunta incluye INNER JOIN, no lo uso.

public Dictionary GetOrderLookup()
 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;

Decidí usar Dapper para obtener una gran cantidad de datos para calcular algunas cosas. Este es mi método de extensión elegante para unirme a la tabla 3 en el archivo _RepositoryBase.cs.

    public List> QueryMultiple(string sql, object param)
        where T2 : class
        where T3 : class
    
        using (var con = new SqlConnection(GetConnStr()))
        
            if (con.State == ConnectionState.Closed)
                con.Open();

            var query = con.Query>(sql, (t, t2, t3, t4) => Tuple.Create(t, t2, t3, t4), param);

            //if (query.Count() == 0)
            //    return new List();

            var data = query.ToList();

            con.Close();
            con.Dispose();

            return data;
        
    

Entonces, esta función lo ayudará a obtener datos unidos a SQL a través de Dapper.

    public List GetSqlJoinedDataViaDaper(int customerId)
    
        var repo = new GenericRepository();
        var sql = @"select table1.ID Table1ID, table1.*,
                    table2.ID Table2ID, table2.*,
                    table3.ID Table3ID, table3.*
                    from dbo.Table1 table1 (nolock)
                    left outer join dbo.Table2 table2 (nolock) on table2.ID=table1.FKTable2ID
                    left outer join dbo.Table3 table3 (nolock) on table3.ID=table1.FKTable3ID
                    where [email protected] ";

        var resultWithJoin = repo.QueryMultiple(sql,
            new  p1 = 1, splitOn = "Table1ID,Table2ID,Table3ID" ).ToList();

        var retval = new List();
        foreach (var item in resultWithJoin)
        
            Table1 t1 = item.Item2; //After first split
            t1.Table2 = item.Item3; //After Table2ID split
            t1.Table3 = item.Item4; //After Table3ID split

            retval.Add(t1);
        
        return retval;
    

Resumen: escriba su selección e inserte división entre tablas. Dígale divisiones a Dapper y obtenga sus datos. Usé esto y trabajé mejor que Entity Framework.

Si guardas alguna desconfianza y disposición de mejorar nuestro enunciado te proponemos escribir una explicación y con placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *