Dapper.NET Semplice mappatura multi-tabella

Esempio

Diciamo che abbiamo una query sui restanti cavalieri che devono compilare una classe Person.

Nome Nato Residenza
Daniel Dennett 1942 Stati Uniti d'America
Sam Harris 1967 Stati Uniti d'America
Richard Dawkins 1941 Regno Unito
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; }
}

Possiamo popolare la classe persona e la proprietà Residenza con un'istanza di Paese utilizzando una Query<> sovraccarico Query<> che accetta un Func<> che può essere utilizzato per comporre l'istanza restituita. Il Func<> può richiedere fino a 7 tipi di input con l'argomento generico finale che è sempre il tipo restituito.

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");

Notare l'uso dello splitOn: "Residence" argomento splitOn: "Residence" che è la prima colonna del prossimo tipo di classe da compilare (in questo caso Country ). Dapper cercherà automaticamente una colonna denominata Id da dividere, ma se non ne trova una e splitOn non viene fornito un System.ArgumentException verrà lanciato con un messaggio utile. Quindi, sebbene sia facoltativo, di solito devi fornire un valore splitOn .