c# - 如何在相关表中进行分页并映射到dapper查询?

标签 c# sql relationship paging dapper

我的数据库中有两个表,如下所示,这些表中有相同名称的列。

[用户].[信息]

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 中为我的查询进行分页。一张 table 没有问题。我可以这样做:

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]。

这是我的标准内连接查询:

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

因为表具有相同的命名列。如何解决这个问题?

我为什么要这样做?

在小巧的调用结果中,我想像在 EntityFramework 中那样从 UserInfo 实体访问 UserType,以及如何在相同的列名称中毫无问题地映射到我的查询结果实体。

这是我现在的 Dapper 电话:)

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

看了很多样例都解不出来。请帮忙!

enter image description here

最佳答案

您也可以尝试将您的查询更改为这个:

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 错误

关于c# - 如何在相关表中进行分页并映射到dapper查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40800512/

相关文章:

sql - 使用 FETCH 、 OFFSET 或 PIVOTS 时出现 ORA-00933 问题

mysql - 如何计算 MySQL 中两个字段的唯一 ID?

c# - 从 LDAP 查询用户组

c# - 执行程序集中的相对路径

mysql - 如何在 MySQL 数据库中将某些地址标记为已发送?

php - Symfony2 关系实体 + 形式

python - 在 SqlAlchemy 中由自动映射创建类后是否可以声明关系

mysql - 如何关联数据库中单个属性的值

c# - 使用 Linq 获取目录结构?

c# - 使用 C# 和流式传输文件上传