J'ai rencontré un problème lors de la tentative de mappage multiple avec Dapper, pour les requêtes de pagination.
Étant donné que j'utilise une requête imbriquée dans ce scénario de pagination, il existe 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 partagent certains champs du même nom. mon exemple de requête ci-dessous (par exemple id
, nom d' displayname
et 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 que dans la requête imbriquée, il va y avoir des problèmes avec les champs id
(apparaît dans le posts
table, les users
des jointures de table et les topics
de jointure), ainsi displayname
et email
(apparaissent à la fois users
table des users
joint).
La seule solution de contournement que j'ai envisagée jusqu'à présent consiste à créer un nom différent pour chacun de ces champs «problématiques», mais cela implique le processus très compliqué de création de propriétés factices dans les modèles concernés. Propriétés "réelles" dans mes modèles pour vérifier également la propriété factice pour une valeur si la valeur réelle n'a pas été définie.
En outre, dans le scénario ci-dessus, je devrais créer x propriétés factices 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 Users, donc 2 factices nommés de manière unique) propriétés uniquement à des fins de cartographie Dapper).
Ce n’est évidemment pas idéal et j’aurais sûrement eu des problèmes et une plus grande désinvolture au fur et à mesure de la création de ces requêtes de pagination multi-cartographie.
J'espère qu'il y a une belle solution propre à ce problème?
Il y a 2 options auxquelles je peux penser:
option 1 : retournez à vos propriétés étendues en dehors de votre requête imbriquée:
select s.*, t1.*, t2.* from
(
select s.*, ROW_NUMBER() OVER (order by somecol) AS RowNumber from Something s
) as X
left join Table t1 on Id = x.SomeId
left join Table t2 on Id = x.SomeOtherId
option 2 : Étendre SqlBuilder pour gérer l'alias de colonne:
select s.*, /**unalias(Table,t1)**/, /**unalias(Table,t2)**/ from
(
select s.*, /**alias(Table,t1)**/, /**alias(Table,t2)**/ ROW_NUMBER() OVER (order by somecol) AS RowNumber from Something s
left join Table t1 on Id = x.SomeId
left join Table t2 on Id = x.SomeOtherId
) as X
Définissez ensuite la macro d'alias pour interroger et mettre en cache une liste de colonnes à partir de la base de données à l'aide de INFORMATION_SCHEMA.COLUMNS
et ajoutez simplement une chaîne "column as column_t1" pour chaque colonne.
Unalias peut faire l'inverse tout simplement.