Salut j'ai les classes suivantes (simplifiées) Je veux que Dapper mappe à
Member.cs
public string FirstName { get; set; }
public string LastName { get; set; }
public Place Address { get; set; }
Place.cs
public string Address{ get; set; }
public string City { get; set; }
public string PostalZip { get; set; }
La réponse que je reçois du serveur SQL ressemble à ceci:
Id FirstName LastName AddressAddress AddressCity
-----------------------------------------------------------------------------
113 First Last Some Address Some City
Quand j'exécute ceci:
var members = session.Connection.Query<Member>(dataQuery, p, transaction).ToList();
Il mappe bien la partie membre, mais la propriété Address du membre (place.cs) reste non mappée, comment dire à dapper comment la mapper?
En supposant que PostalZip n’est pas un type Place mais probablement une simple chaîne, votre requête Dapper pourrait être
using (IDbConnection connection = OpenConnection())
{
string query = @"SELECT Id,FirstName,LastName,
0 as splitterID, Address, City, PostalZip
FROM Members";
var result = connection.Query<Member, Place, Member>(query, (mb, pl) =>
{
mb.Address = pl;
return mb;
},
splitOn: "splitterID");
}
Cette requête renvoie tous les enregistrements de la table Members
dans une variable IEnumerable<Member>
. Chaque élément de IEnumerable (un membre) a son champ d'adresse configuré comme un lieu avec adresse, ville et code postal extrait de la deuxième partie de l'enregistrement.
L'astuce réside dans l'expression lambda transmise à la méthode Query. Ici, nous déclarons qu’il s’agit d’un Func recevant un Membre et d’une Place des stagiaires de Dapper et d’un Membre qui revient.
La bibliothèque Dapper comprend la nécessité de créer une instance du type Place lorsqu'elle détecte le faux splitterID
champ défini par le paramètre splitOn
et transmet cette instance à lambda avec l'instance Member.
L'expression lambda affecte l'instance de Place à la propriété Address de l'instance Member et renvoie la même instance Member correctement initialisée.
(Je n'ai pas réussi à me séparer directement du champ Adresse et serais curieux de savoir s'il y a un moyen de le faire sans un faux champ)