Problema de nombre de campo duplicado en una consulta de paginación Dapper de asignación múltiple anidada

.net c# dapper orm

Pregunta

Me encontré con un problema al tratar de hacer múltiples mapas usando Dapper, para consultas de paginación.

Como utilizo una consulta anidada en este escenario de paginación, hay varias tablas dentro de la consulta anidada a las que debo unirme para obtener mis datos de múltiples mapas, pero algunas de estas tablas compartirán algunos campos del mismo nombre que puede ver en mi consulta de ejemplo a continuación (por ejemplo, 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";

En el ejemplo anterior, puede ver que dentro de la consulta anidada, habrá problemas con el id los campos (aparece en la tabla de posts , se unen las tablas de los users y los topics se unen a la tabla), y también displayname y email (aparecen en ambos users tabla de users se une).

La única solución que he pensado hasta ahora consiste en asignar cada uno de estos campos 'problema' como un nombre diferente, pero esto involucra el muy desordenado proceso de creación de propiedades ficticias en los modelos afectados, por lo que el multimapping puede mapearlos y editar el Las propiedades "reales" en mis modelos también comprueban la propiedad ficticia para un valor si el valor real no se ha establecido.

Además, en el escenario anterior, tendría que crear x propiedades ficticias donde x es el número de combinaciones que puedo tener en la misma tabla dentro de una consulta (en este ejemplo, 2 uniones en la misma tabla Usuarios, por lo tanto, requiere 2 maniquí único propiedades solo para los propósitos de mapeo Dapper).

Obviamente, esto no es lo ideal y estoy seguro de que habría causado problemas y más desorden, ya que creé más de estas consultas de paginación multi-mapeo.

Espero que haya una buena y limpia solución para este problema?

Respuesta aceptada

Hay 2 opciones que puedo pensar:

Opción 1 : vuelva a unirse a sus propiedades extendidas fuera de su consulta anidada:

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

Opción 2 : Extienda SqlBuilder para controlar el aliasing de columna:

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 

A continuación, defina la macro de alias para consultar y almacenar en caché una lista de columnas del archivo db utilizando INFORMATION_SCHEMA.COLUMNS y simplemente agregue una cadena 'column as column_t1` para cada columna.

Unalias puede hacer el reverso de forma bastante simple.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué