Problème de nom de champ dupliqué dans une requête de pagination Dapper multi-mappage imbriquée

.net c# dapper orm

Question

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?

Réponse acceptée

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.




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