중첩 다중 매핑에서 중복 된 필드 이름 문제 Dapper 매김 쿼리

.net c# dapper orm

문제

페이지 매김 쿼리의 경우 Dapper를 사용하여 다중 매핑을 시도 할 때 문제가 발생했습니다.

이 페이지 매김 시나리오에서 중첩 된 쿼리를 사용하기 때문에 다중 매핑 된 데이터를 가져 오기 위해 조인해야하는 중첩 쿼리 내에 여러 테이블이 있지만 일부 테이블은 같은 이름의 일부 필드를 공유합니다. 아래 나의 예제 쿼리 (예 : id , displaynameemail ) :

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";

당신이 중첩 된 쿼리 내에서 그것을 볼 수 있습니다 위의 예에서, 필드에 문제가있을 예정 id 합니다 (에 표시되는 posts 테이블, 모두 users 테이블 조인과 topics 테이블 조인), 또한 displaynameemail (모두 표시 users 테이블 조인).

지금까지 생각한 유일한 해결책은이 '문제'필드 각각을 다른 이름으로 캐스팅하는 것이지만, 영향을받는 모델에서 더미 속성을 만드는 매우 복잡한 프로세스가 포함되므로 다중 매핑이 이러한 작업에 매핑되고 실제 값이 설정되지 않은 경우 모델의 '실제'속성을 사용하여 더미 속성의 값을 확인합니다.

또한, 위의 시나리오에서 x 더미 속성을 만들어야 할 것입니다. 여기서 x는 쿼리 내에서 동일한 테이블에있을 수있는 조인의 수입니다 (이 예제에서는 동일한 Users 테이블에 2 조인이 있으므로 고유하게 명명 된 더미 2 개가 필요합니다 Dapper 매핑 목적을위한 속성).

이것은 분명히 이상적은 아니며, 이러한 다중 매핑 페이지 매김 쿼리를 더 많이 만들면서 문제가 많고 조급함이 없을 것입니다.

나는이 문제에 대해 훌륭하고 깨끗한 해결책이 있기를 바라고있다.

수락 된 답변

내가 생각할 수있는 두 가지 옵션이 있습니다.

옵션 1 : 중첩 쿼리 외부의 확장 속성에 다시 가입하십시오.

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 

옵션 2 : 열 별칭을 처리하도록 SqlBuilder 확장 :

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 

그런 다음 쿼리 할 별칭 매크로를 정의하고 INFORMATION_SCHEMA.COLUMNS 사용하여 db에서 열 목록을 캐시하고 각 열에 'column as column as column'문자열을 추가하기 만하면됩니다.

Unalias는 그 반대를 아주 간단하게 할 수 있습니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.