División de fila en varios objetos anidados

dapper

Pregunta

Tengo la siguiente consulta:

select id, name, email, supervisor, createdBy, createdAt, changedBy, changedAt from XXX

Ahora, me gustaría asignar cada fila a algo que se vea así:

public class Organisation{
  public int Id{get; set; }
  public string Name{get; set; }
  public ContactInfo Contact{get;set;}
  public Action CreatedBy{get;set;}
  public Action ChangedBy{get;set;}
}
public class ContactInfo{
  public string Name{get;set;}
  public string Email{get;set;}
}
public class Action{
  public string Username{get;set;}
  public DateTime At{get;set;}
}

He visto algunos ejemplos que muestran cómo particionar la información, pero parece que no funcionará en este ejemplo. ¿Se puede hacer o debería asignar mi consulta a un objeto auxiliar que luego se mapeará en estas clases?

Gracias.

Luis

Respuesta aceptada

Dapper le permite asignar una sola fila a múltiples objetos. Esta es una característica clave si desea evitar consultas extrañas y asociaciones de carga ansiosas.

Puedes leer más sobre esto aquí

A continuación hay un ejemplo:

[Test]
public void Test_Multi()
{
    using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
    {
        var result = conn.Query<Organisation, ContactInfo, Action, Action, Organisation>(
            @"select Id = 100, Name = 'Foo', 
                Name = 'Contact Name', Email = 'contact@foo.com', 
                Username = 'The Creator', At = '12/25/2017', 
                Username = 'The Modifier', At = '12/26/2017' ",
            (org, contact, cretedBy, changedBy) =>
            {
                org.Contact = contact;
                org.CreatedBy = cretedBy;
                org.ChangedBy = changedBy;

                return org;
            }, splitOn: "Id, Name, Username, Username").First();

        Assert.That(result.Id, Is.EqualTo(100));
        Assert.That(result.Contact.Email, Is.EqualTo("contact@foo.com"));
        Assert.That(result.CreatedBy.Username, Is.EqualTo("The Creator"));
        Assert.That(result.ChangedBy.Username, Is.EqualTo("The Modifier"));

    }
}


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é