简单的多表映射

假设我们有一个需要填充 Person 类的剩余骑手的查询。

名称 天生 住宅
丹尼尔丹尼特 1942 年 美国
山姆哈里斯 1967 年 美国
理查德道金斯 1941 年 英国
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; }
}

我们可以使用一个带有 Func<> 的过载 Query<> 来填充 person 类和 Residence 属性,其中包含一个可用于组成返回实例的 Func<>Func<> 最多可以包含 7 种输入类型,最终泛型参数始终是返回类型。

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

注意使用 splitOn: "Residence" 参数,它是要填充的下一个类类型的第一列(在本例中为 Country)。Dapper 将自动查找名为 Id 的列以进行拆分,但如果找不到并且未提供 splitOn,将会抛出 System.ArgumentException 并显示有用的消息。因此,虽然它是可选的,但你通常必须提供 splitOn 值。