Dapper多映射两种相同类型的属性

bat*_*wad 5 dapper

假设我以平展形式存储在我的数据库中的联系人,这样我就像这样查询它们:

SELECT Name, HomeHouseNumber, HomePostcode, WorkHouseNumber, WorkPostcode FROM Contacts
Run Code Online (Sandbox Code Playgroud)

我希望在我的C#代码中有一个更多的结构,并且这个简单的定义了一个带有家庭和工作地址的联系人.

class Address
{
    public string HouseNumber { get; set; }
    public string Postcode { get; set; }
}

class Contact
{
    public string Name { get; set; }
    public Address HomeAddress { get; set; }
    public Address WorkAddress { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我发现我可以使用多映射通过别名选择列中的列来提取家庭地址,如下所示:

IEnumerable<Contact> GetContacts()
{
    return Connection.Query<Contact, Address, Address, Contact>(
        "SELECT Name, HomeHouseNumber as HouseNumber, HomePostcode as Postcode, WorkHouseNumber, WorkPostcode FROM Contacts",
        (contact, home, work) =>
        {
            contact.HomeAddress = home;
            contact.WorkAddress = work;
            return contact;
        },
        splitOn: "HouseNumber,WorkHouseNumber");
}
Run Code Online (Sandbox Code Playgroud)

但是,我不能将工作地址列别名,以便映射它们.Dapper可以为我执行此映射还是我必须手动执行此操作?

bat*_*wad 7

令人难以置信的是,解决方案是为列提供相同的别名.我不认为SQL会允许这样做,但确实如此,Dapper完美地映射了它.

IEnumerable<Contact> GetContacts()
{
    return Connection.Query<Contact, Address, Address, Contact>(
        "SELECT Name, HomeHouseNumber as HouseNumber, HomePostcode as Postcode, WorkHouseNumber as HouseNumber, WorkPostcode as Postcode FROM Contacts",
        (contact, home, work) =>
        {
            contact.HomeAddress = home;
            contact.WorkAddress = work;
            return contact;
        },
        splitOn: "HouseNumber,HouseNumber");
}
Run Code Online (Sandbox Code Playgroud)