簡單的多表對映

假設我們有一個需要填充 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 值。