You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dapper查询用户角色列表提示User关键字附近语法错误如何修复?

问题修复方案

直接报错原因修复

你收到的语法错误核心原因是 User 属于绝大多数关系型数据库的保留关键字,直接作为表名查询会触发语法校验失败,需要根据你使用的数据库类型对表名加转义符:

  • SQL Server 环境:将SQL语句中的 from User u 修改为 from [User] u
  • MySQL / MariaDB 环境:将SQL语句中的 from User u 修改为 from `User` u
  • PostgreSQL 环境:将SQL语句中的 from User u 修改为 from "User" u

其他潜在代码问题修复

你的代码中还存在两个会导致后续运行/编译报错的问题:

  1. 空引用异常风险:User 类的 Role 集合属性没有初始化,执行映射委托中的 user.Role.Add(role) 时会触发空引用异常,建议在 User 类的构造函数中添加初始化逻辑:Role = new List<Role>();
  2. 变量拼写错误:分组逻辑中返回的 groupedUsers 多写了后缀s,实际定义的变量是 groupedUser,修改为正确变量名即可。

修正后的完整代码

// 先修改User类,添加构造函数初始化集合
public class User : SqlEntityBase
{
    public User()
    {
        Role = new List<Role>();
    }
    public string FirstName { get; set; }
    // ... 其他属性
    public List<Role> Role { get; set; }
}

// 修正后的查询方法
public async Task<List<User>> GetUserWithRolesAsync()
{
    using var dbConnection = _context.CreateConnection();

    // 这里以SQL Server为例,加了[]转义User表名,其他数据库对应修改转义符即可
    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";

    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.SelectMany(p => p.Role).Distinct().ToList();
            // 修正拼写错误
            return groupedUser;
        });

    return result.ToList();
}

注:分组逻辑里优化为用SelectMany+Distinct,避免单个用户多个角色时出现重复数据。

内容的提问来源于stack exchange,提问作者TrypicalDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:54:06