Dapper multi, отображающий два свойства одного типа

Допустим, у меня есть контакты, хранящиеся в моей базе данных в плоской форме, так что я запрашиваю их следующим образом:

SELECT Name, HomeHouseNumber, HomePostcode, WorkHouseNumber, WorkPostcode FROM Contacts

Я хотел бы немного больше структурировать в своем коде 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; }
}

Я обнаружил, что могу использовать множественное сопоставление и извлекать домашний адрес, используя псевдонимы столбцов в select:

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

Однако я не могу создать псевдоним столбцов рабочего адреса таким образом, чтобы они отображались. Может ли Dapper выполнить это отображение для меня или я должен сделать это вручную?

1 ответ

Решение

Решение, невероятно, состоит в том, чтобы дать столбцам одинаковый псевдоним. Я не думал, что SQL допустит это, но это происходит, и Даппер все это отлично отображает.

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");
}
Другие вопросы по тегам