J'ai rencontré un problème en essayant de faire du multi-mapping avec Dapper, pour des requêtes de pagination.
Comme j'utilise une requête imbriquée dans ce scénario de pagination, il y a plusieurs tables dans la requête imbriquée que je dois joindre pour obtenir mes données multi-mappées, mais certaines de ces tables partageront des champs du même nom, comme vous pouvez le voir dans mon exemple de requête ci-dessous (par ex. id
, displayname
y email
):
q = @"select * from (select p.id, p.title, p.etc...,
u1.id, u1.displayname, u1.email,
u2.id, u2.displayname, u2.email,
t.id, t.name,
row_number() over (order by " + sort.ToPostSortSqlClause() + ") as rownum" +
" from posts p" +
" join users u1 on p.owneruserid = u1.id" +
" join users u2 on p.lastediteduserid = u2.id" +
" join topics t on p.topicid = t.id" +
") seq where seq.rownum between @pLower and @pUpper";
Dans l'exemple ci-dessus, vous pouvez voir qu'à l'intérieur de la requête imbriquée, il y aura des problèmes avec les champs id
(figure dans le posts
les deux users
et les jointures de tables topics
), ainsi que displayname
y email
(apparaissent dans les deux users
les jonctions de tables).
La seule solution à laquelle j'ai pensé jusqu'à présent consiste à attribuer un nom différent à chacun de ces champs "problématiques", mais cela implique un processus très compliqué de création de propriétés fictives dans les modèles concernés, afin que le multimapping puisse s'y appliquer, et de modification des propriétés "réelles" dans mes modèles afin de vérifier également la valeur de la propriété fictive si la valeur réelle n'a pas été définie.
De plus, dans le scénario ci-dessus, je devrais créer x propriétés fictives où x est le nombre de jointures que je peux avoir sur la même table dans une requête (dans cet exemple, 2 jointures sur la même table Utilisateurs, nécessitant donc 2 propriétés fictives nommées de manière unique juste pour les besoins du mapping Dapper).
Ce n'est évidemment pas l'idéal et je suis sûr qu'il y aurait des problèmes en cascade et plus de désordre au fur et à mesure que je créerais plus de ces requêtes de pagination multi-mappings.
J'espère qu'il existe une solution simple et efficace à ce problème ?