Как сделать разбиение на страницы в связанных таблицах и сопоставить с более сложным запросом?

У меня есть две таблицы, как показано ниже в моей БД, и есть столбцы с такими же именами в этих таблицах.

[User]. [Информация]

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

[User].[Type]

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 в своем проекте и хочу получить [User].[Info] и [User].[Type] из db с пейджингом, как описано выше.

Это мой стандартный запрос внутреннего соединения:

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'.

Из-за таблиц есть одинаковые именованные столбцы. Как решить эту проблему?

Почему я хочу это сделать?

В более щадящем результате вызова я хочу достичь UserType из сущности UserInfo, как в EntityFramework и Как отобразить мои сущности запроса без проблем в тех же именах столбцов.

Это мой щекотливый зов сейчас:)

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

Я посмотрел много образцов, но я не мог решить. Пожалуйста помоги!

1 ответ

Вы также можете попробовать изменить свой запрос на этот:

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

Другие вопросы по тегам