SQL select 语句通过 dapper 抛出异常

SQL select statement throws exception via dapper

我正在尝试通过 Dapper 检索所有具有角色的用户 - 这是方法和查询:

public async Task<List<User>> GetUserWithRolesAsync()
{
    using var dbConnection = _context.CreateConnection();

    var sql = @"select u.Id, u.FirstName, u.LastName, r.Id, r.Name
                from User u 
                inner join UserRole ur on ur.UserId = u.Id
                inner join Role r on r.Id = ur.RoleId";

    // this line throws exception;
    var users = await dbConnection.QueryAsync<User, Role, User>(sql, (user, role) =>
        {
            user.Role.Add(role);
            return user;
        }, splitOn: "Id");

    var result = users.GroupBy(p => p.Id).Select(g =>
        {
            var groupedUser = g.First();
            groupedUser.Role = g.Select(p => p.Role.Single()).ToList();
            return groupedUsers;
        });

    return result.ToList();
}

这是我得到的错误:

Incorrect syntax near the keyword 'User'

我该如何解决?

如果需要实体详细信息,这里是 table 定义:

public class User : SqlEntityBase
{
    public string FirstName { get; set; }...
    public List<Role> Role { get; set; }
}

public class Role : SqlEntityBase
{
    public string Name { get; set; }
    public List<User> User { get; set; }
}

public class UserRole : SqlEntityBase
{
    public int UserId { get; set; }
    public int RoleId { get; set; }
    public User User { get; set; }
    public Role Role { get; set; }
}

假设您使用 SQL Server 作为数据库 - User 是保留的 T-SQL 关键字。您应该尽量避免为您自己的数据库对象使用这些保留关键字 - 使用更具描述性、更合适的名称。

如果您无法更改它 - 那么您必须将 table 名称放入 SQL 中的方括号(或双引号)中:

var sql = @"select u.Id, u.FirstName, u.LastName, r.Id, r.Name
            from [User] u 
            inner join UserRole ur on ur.UserId = u.Id
            inner join Role r on r.Id = ur.RoleId";