Dapper construit-il un nouvel objet pour les résultats de jointure dupliqués?

c# dapper

Question

Lorsque Dapper effectue un JOIN , appelle-t-il le constructeur pour chaque a , b , c ? ou chacun unique a , b , c ?

string sql = @"SELECT a.*, b.*, c.* 
               FROM A a
               JOIN B b ON b.Id = a.BId
               JOIN C c ON b.Id = c.BId";

var results = db.Query<A, B, C, A>(sql, (a, b, c) => { return a; });

Par exemple, si j'ai des doublons de c , Dapper appellera-t-il le constructeur de c plusieurs fois?

Ou remarquera-t-il que les identifiants sont les mêmes entre les lignes et me transmettent le même objet pour toutes les instances où l'id est le même?

Modifier:

Après quelques tests, il semble qu'il appelle le constructeur plusieurs fois pour les valeurs en double.

Existe-t-il un moyen simple de contourner ce problème à l'aide de l'API Dapper?

Réponse populaire

Je vais proposer ma solution mais laissez cette question ouverte au cas où quelqu'un aurait une meilleure idée.

C'est ce que j'ai fait:

List<dynamic> results = db.Query<dynamic, dynamic, dynamic, dynamic>(sql,
    (a, b, c) => { return new { a, b, c }; }).ToList(); // splitOn: 'Id'

List<dynamic> a_ids = new List<dynamic>();
List<dynamic> b_ids = new List<dynamic>();
List<dynamic> c_ids = new List<dynamic>();

List<A> unique_as = new List<A>();
List<B> unique_bs = new List<B>();
List<C> unique_cs = new List<C>();
foreach (var row in results)
{
    var a = row.a;
    var b = row.b;
    var c = row.c;
    if(!a_ids.Contains(a.Id)) unique_as.Add(new A(a.Id));
    if(!b_ids.Contains(b.Id)) unique_bs.Add(new B(b.Id));
    if(!c_ids.Contains(c.Id)) unique_cs.Add(new C(c.Id));
}

Ce serait bien si Dapper supportait cela dans le futur, mais d'ici là, j'espère que cela aidera quelqu'un d'autre.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi