En Dapper Multiple Results, ¿cómo se logra que la segunda línea de consulta funcione cuando la cláusula where depende del resultado de la primera consulta?

c# dapper sql

Pregunta

Obtenga la lista de clientes con sus pedidos relacionados y muestra devoluciones:

var sql = @"select * from Customers
select * from Orders where CustomerId = (depends on first query)
select * from Returns where CustomerId = (depends on first query)";

using (var multi = connection.QueryMultiple(sql))
{
   var customer = multi.Read<Customer>().ToList();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...
} 

Respuesta experta

Esto es en última instancia una pregunta de SQL. No hay nada extra o diferente que haga dapper aquí: si emite múltiples selecciones como un lote, deben ser SQL válidos. Hay varias formas de hacerlo, que involucran:

  • variables sql locales (típicamente si una fila)
  • tablas temporales o (mejor) variables de tabla
  • uniones o subconsultas
  • etc

Si no puede construir SQL para hacer lo que desea, considere ejecutar la primera consulta por separado en su lugar.


Respuesta popular

Como Marc Gravell ya te había dado una pista, aparte de eso, el código a continuación podría ayudarte.

Digamos que tienes este tipo de modelo.

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Order> Orders { get; set; }
    public List<Return> Returns { get; set; }
}

Y aquí está tu método.

public List<Customer> GetCustomers()
{
    var customerList = new List<Customer>();

    string query = "SELECT Id, " +
                    "[Name] FROM Customers";

    string subsetquery = @"select * from Orders where CustomerId = @Id;
                            select * from Returns where CustomerId = @Id";

    customerList = _connection.Query<Customer>(query);

    foreach (var item in customerList)
    {
        var oPara = new DynamicParameters();
        oPara.Add("@Id", item.Id, dbType: DbType.Int32);

        using (var multi = _connection.QueryMultiple(subsetquery, oPara, commandType: CommandType.Text))
        {
            item.orders = multi.Read<Order>();
            item.returns = multi.Read<Return>();
        }
    }
    return customerList;
}

NOTA: El código anterior no se prueba en VS. Así que puede que tenga que cambiar según su requisito.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué