관련 테이블에서 페이징을 수행하고 더러운 쿼리에 매핑하는 방법?

c# dapper paging relationship sql

문제

아래 테이블에 두 개의 테이블이 있고이 테이블에 같은 이름의 열이 있습니다.

[사용자 정보]

TABLE_SCHEMA    TABLE_NAME  COLUMN_NAME
User    Info    Id
User    Info    UniqueId
User    Info    Name
User    Info    Email
User    Info    CompanyInfoId
User    Info    UserTypeId
User    Info    LanguageId
User    Info    InsertedBy
User    Info    InsertedOn
User    Info    UpdatedBy
User    Info    UpdatedOn
User    Info    DeletedBy
User    Info    DeletedOn
User    Info    IsDeleted

[사용자 유형]

TABLE_SCHEMA    TABLE_NAME  COLUMN_NAME
User    Type    Id
User    Type    UniqueId
User    Type    Name
User    Type    CompanyInfoId
User    Type    LanguageId
User    Type    InsertedBy
User    Type    InsertedOn
User    Type    UpdatedBy
User    Type    UpdatedOn
User    Type    DeletedBy
User    Type    DeletedOn
User    Type    IsDeleted

내 쿼리에 대해 SQL에서 페이징을 수행하려고합니다. 테이블 하나에 문제가 없습니다. 나는 아래와 같이 그것을 할 수있다 :

DECLARE @Page       AS INT = 1
DECLARE @PageSize   AS INT = 10
SELECT TOP (@PageSize) Paged.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY Id) AS Row, * FROM [User].[Info]) AS Paged WHERE Row > (@Page - 1) * @PageSize

하지만 나는 프로젝트에서 DAPPER를 사용하고 있는데, [사용자]. [정보]와 [사용자]를 얻고 싶습니다. [유형] db에서 위와 같이 페이징을합니다.

이것은 내 standart inner join 쿼리입니다.

SELECT TOP 10 * FROM [User].[Info] ui INNER JOIN [User].[Type] ut ON ui.UserTypeId = ut.Id

그리고 페이징을 위해이 쿼리를 시도했습니다.

DECLARE @Page       AS INT = 1
DECLARE @PageSize   AS INT = 10
SELECT TOP (@PageSize) Paged FROM ( 
    SELECT ROW_NUMBER() OVER (ORDER BY ui.Id) AS RowNumber, ui.*, ut.* FROM [User].[Info] ui INNER JOIN [User].[Type] ut ON ui.UserTypeId = ut.Id
) AS Paged WHERE RowNumber > (@Page - 1) * @PageSize

결과적으로 다음과 같은 오류가 발생합니다.

Msg 8156, Level 16, State 1, Line 102
The column 'Id' was specified multiple times for 'Paged'.
Msg 207, Level 16, State 1, Line 100
Invalid column name 'Paged'.

테이블 때문에 동일한 명명 된 열이 있습니다. 이 문제를 해결하는 방법?

왜 내가 이걸하고 싶어?

Dapper 콜 결과에서 EntityFramework와 같이 UserInfo 엔티티에서 UserType에 도달하고 동일한 열 이름에 아무 문제없이 쿼리 결과의 엔티티에 매핑하는 방법을 원합니다.

이것은 지금 내 부탁이야 :)

    public IEnumerable<UserInfo> All()
    {
        using (IDbConnection db = CreateConnection())
        {
            var sql = "MY SQL QUERY WITH PAGING";
            var command = db.Query<UserInfo, UserType, UserInfo>(sql, (userInfo, userType) =>
            {
                userInfo.UserType = userType;
                return userInfo;
            });

            return command;
        }
    }

나는 많은 샘플을 보았지만 해결할 수 없었다. 도와주세요!

여기에 이미지 설명을 입력하십시오.

인기 답변

다음과 같이 쿼리를 변경해보십시오.

DECLARE @Page       AS INT = 1
DECLARE @PageSize   AS INT = 10

SELECT 
    ui.*, 
    ut.* 
FROM [User].[Info] ui 
   INNER JOIN [User].[Type] ut ON ui.UserTypeId = ut.Id
ORDER BY ui.Id
OFFSET (@Page - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY

나는 그것이 DAPPER에 대해 괜찮을 지 모르지만 SQL Server 오류를 해결합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow