J'ai joué un peu avec cela, parce qu'il me semble que cela ressemble beaucoup au exemple de postes documentés/utilisateurs mais il est légèrement différent et ne fonctionne pas pour moi.
Supposons la configuration simplifiée suivante (un contact a plusieurs numéros de téléphone) :
public class Contact
{
public int ContactID { get; set; }
public string ContactName { get; set; }
public IEnumerable<Phone> Phones { get; set; }
}
public class Phone
{
public int PhoneId { get; set; }
public int ContactID { get; set; } // foreign key
public string Number { get; set; }
public string Type { get; set; }
public bool IsActive { get; set; }
}
J'aimerais obtenir quelque chose qui renvoie un contact avec plusieurs objets téléphone. De cette façon, si j'ai 2 contacts, avec 2 téléphones chacun, mon SQL renverrait une jointure de ceux-ci comme un ensemble de résultats avec 4 lignes au total. Dapper renverrait alors deux objets contact avec deux téléphones chacun.
Voici le SQL dans la procédure stockée :
SELECT *
FROM Contacts
LEFT OUTER JOIN Phones ON Phones.ReferenceId=Contacts.ReferenceId
WHERE clientid=1
J'ai essayé, mais je me suis retrouvé avec 4 Tuples (ce qui est correct, mais pas ce que j'espérais... cela signifie simplement que je dois encore re-normaliser le résultat) :
var x = cn.Query<Contact, Phone, Tuple<Contact, Phone>>("sproc_Contacts_SelectByClient",
(co, ph) => Tuple.Create(co, ph),
splitOn: "PhoneId", param: p,
commandType: CommandType.StoredProcedure);
et lorsque j'essaie une autre méthode (ci-dessous), j'obtiens une exception de "Unable to cast object of type 'System.Int32' to type 'System.Collections.Generic.IEnumerable`1[Phone]'".
var x = cn.Query<Contact, IEnumerable<Phone>, Contact>("sproc_Contacts_SelectByClient",
(co, ph) => { co.Phones = ph; return co; },
splitOn: "PhoneId", param: p,
commandType: CommandType.StoredProcedure);
Est-ce que je fais quelque chose de mal ? Cela ressemble à l'exemple de posts/owner, sauf que je vais du parent vers l'enfant au lieu de l'enfant vers le parent.
Merci d'avance