Dapper Multi-map en el siguiente nivel

dapper

Pregunta

Estoy usando mapeo múltiple para una consulta actual y ahora necesito asignar otro objeto en la consulta inicial.

Por ejemplo:

public class Part {
  public int Id { get; set; }
  public string Name { get; set; }

  public Address Address { get; set; }

}

public class Address {
  public int Id { get; set; }
  public string Street { get; set; }

  public SiteOu Ou { get; set; }
}

public class SiteOu 
  public int Id { get; set; }
  public string Name { get; set; }
}

Apuesto:

 connection.Query<Part, Address, Part>(sql, (part, address) => {
    part.Address = address;
  });

¿Cómo obtengo la clase Address para tener la información de SiteOu?

Este ejemplo no es lo que estoy haciendo en realidad porque de hecho tengo

Query<T1,T2,T3,T4,T5,TResult>();  

Estoy haciendo 1 selección y 5 uniones en mi consulta. Así que con suerte no necesito más sobrecargas de Query.

Respuesta aceptada

Dapper le permite asignar una sola fila a múltiples objetos, por lo que puede asignar SiteOu como parte de la misma consulta.

[Test]
public void TestSplitOn()
{
    var conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;Integrated Security=true;Initial Catalog=db");
    conn.Open();
    const string sql = "select Id = 1, Name = 'My Part', " +
                       "Id = 2, Street = 'My Street', " +
                       "Id = 3, Name = 'My Site'";
    var result = conn.Query<Part, Address, SiteOu, Part>(sql, (part, address, siteOu) =>
    {
        part.Address = address;
        address.Ou = siteOu;
        return part;
    },
    commandType: CommandType.Text
    ).FirstOrDefault();

    Assert.That(result, Is.Not.Null);
    Assert.That(result.Address, Is.Not.Null);
    Assert.That(result.Address.Ou, Is.Not.Null);
}

Nota importante: Dapper supone que sus columnas Id se llaman "Id" o "id"; si su clave principal es diferente o si desea dividir la fila ancha en un punto que no sea "Id", utilice el parámetro opcional "splitOn".

Si tiene más de 5 tipos para mapear, otra opción lista para usar es usar la extensión QueryMultiple. Aquí hay un ejemplo de los documentos Dapper.

var sql = 
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";

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

También mira este hilo .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow