Dapper.NET Mapeo simple multi-mesa


Ejemplo

Digamos que tenemos una consulta de los jinetes restantes que necesitan poblar una clase de Persona.

Nombre Nacido Residencia
Daniel Dennett 1942 Estados Unidos de America
Sam Harris 1967 Estados Unidos de America
Richard Dawkins 1941 Reino Unido
public class Person
{
    public string Name { get; set; }
    public int Born { get; set; }
    public Country Residience { get; set; }
}

public class Country
{
    public string Residence { get; set; }
}

Podemos rellenar la clase de persona y la propiedad Residencia con una instancia de País usando una Query<> sobrecarga Query<> que toma una función Func<> que se puede usar para componer la instancia devuelta. El Func<> puede tomar hasta 7 tipos de entrada con el argumento genérico final siempre siendo el tipo de retorno.

var sql = @"SELECT 'Daniel Dennett' AS Name, 1942 AS Born, 'United States of America' AS Residence
UNION ALL SELECT 'Sam Harris' AS Name, 1967 AS Born, 'United States of America' AS Residence
UNION ALL SELECT 'Richard Dawkins' AS Name, 1941 AS Born, 'United Kingdom' AS Residence";

var result = connection.Query<Person, Country, Person>(sql, (person, country) => {
        if(country == null)
        {
            country = new Country { Residence = "" };
        }
        person.Residience = country;
        return person;
    }, 
    splitOn: "Residence");

Tenga en cuenta el uso del splitOn: "Residence" que es la primera columna del siguiente tipo de clase que se completará (en este caso, Country ). Dapper buscará automáticamente una columna llamada Id para dividir, pero si no encuentra una y splitOn no se proporciona, se splitOn una splitOn System.ArgumentException con un mensaje útil. Entonces, aunque es opcional, normalmente tendrá que proporcionar un valor de splitOn .