Propiedad del mapa Dapper

c# dapper

Pregunta

Hola, tengo las siguientes clases (simplificadas) Quiero que apunte para mapear

Member.cs

public string FirstName { get; set; }
public string LastName { get; set; }
public Place Address { get; set; }

Place.cs

public string Address{ get; set; }
public string City { get; set; }
public string PostalZip { get; set; }

La respuesta que recibo del servidor SQL se ve así:

Id  FirstName   LastName    AddressAddress      AddressCity
-----------------------------------------------------------------------------
113     First       Last        Some Address        Some City

Cuando ejecuto esto:

var members = session.Connection.Query<Member>(dataQuery, p, transaction).ToList();

Correlaciona perfectamente la parte Member, pero la propiedad Address en el miembro (place.cs) permanece sin asignar, ¿cómo le digo a apresurado cómo mapearla?

Respuesta aceptada

Suponiendo que PostalZip no es un tipo de lugar, pero probablemente una cadena simple, su consulta Dapper podría hacerse como

using (IDbConnection connection = OpenConnection())
{
    string query = @"SELECT Id,FirstName,LastName,
                    0 as splitterID, Address, City, PostalZip 
                    FROM Members";
    var result = connection.Query<Member, Place, Member>(query, (mb, pl) =>
    {
        mb.Address = pl;
        return mb;
    },
    splitOn: "splitterID");
}

Esta consulta devuelve todos los registros de la tabla Members en una IEnumerable<Member> . Cada elemento de IEnumerable (un miembro) tiene su campo de dirección configurado como un lugar con dirección, ciudad y código postal extraído de la segunda parte del registro.

El truco está en la expresión lambda pasada al método Query. Aquí declaramos que es un Func que recibe un miembro y un lugar de los internos de Dapper y un miembro que regresa.
La biblioteca Dapper comprende la necesidad de crear una instancia del tipo Place cuando encuentra el splitterID campo falso definido por el parámetro splitOn y pasa esta instancia a la lambda junto con la instancia Member.

La expresión lambda asigna la instancia de Lugar a la dirección de la propiedad de la instancia de Miembro y devuelve la misma instancia de Miembro correctamente inicializada.

(No pude dividirme directamente con el campo Dirección y sentiré curiosidad por saber si hay una manera de hacerlo sin un campo falso)



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é