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
其他潜在代码问题修复
你的代码中还存在两个会导致后续运行/编译报错的问题:
- 空引用异常风险:
User类的Role集合属性没有初始化,执行映射委托中的user.Role.Add(role)时会触发空引用异常,建议在User类的构造函数中添加初始化逻辑:Role = new List<Role>(); - 变量拼写错误:分组逻辑中返回的
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
相关产品推荐
相关产品推荐

