Disons que j'ai des contacts stockés dans ma base de données sous une forme aplatie, de sorte que je les interroge comme ceci:
SELECT Name, HomeHouseNumber, HomePostcode, WorkHouseNumber, WorkPostcode FROM Contacts
Je voudrais un peu plus de structure dans mon code C # et avoir cette définition simple d'un contact avec une adresse de domicile et de travail.
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; }
}
J'ai trouvé que je pouvais utiliser le mappage multiple extraire l'adresse de la maison en utilisant les colonnes de la sélection comme ceci:
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");
}
Cependant, je ne peux pas créer d'alias pour les colonnes d'adresse de travail de manière à ce qu'elles soient mappées. Dapper peut-il effectuer cette cartographie pour moi ou dois-je le faire manuellement?
La solution, incroyablement, est de donner aux colonnes le même alias. Je ne pensais pas que SQL autoriserait cela, mais Dapper le cartographie parfaitement.
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");
}