ASP.NET Core中Dapper SplitOn报错:未找到UserNameId列的问题
解决Dapper多映射SplitOn报错问题
核心问题分析
报错提示找不到UserNameId列,主要原因是泛型参数顺序错误,导致Dapper的映射逻辑混乱,无法正确识别splitOn指定的拆分列。此外也需要确认列名匹配性。
解决方案步骤
1. 修正泛型参数顺序
Dapper的Query多映射泛型参数规则是:前N个参数是要从结果集拆分的实体类型,最后一个参数是最终返回的组合类型。你当前把返回类型EmployeeResponse放在了第一个泛型参数位置,这是错误的。
修正后的代码:
var obj = _connection.Query<Login, UserName, GroupAccess, EmployeeResponse>( sql: query, map: (login, userName, groupAccess) => { var employeeResponse = new EmployeeResponse(); employeeResponse.Login = login; employeeResponse.UserName = userName; employeeResponse.GroupAccess = groupAccess; return employeeResponse; }, splitOn: "UserNameId,GroupId", param: new { Id = request.IdEmployee } ).FirstOrDefault();
2. 验证列名匹配性
确保SQL查询返回的列名和splitOn指定的列名完全一致(注意大小写,不同数据库规则不同:比如Oracle默认返回大写列名,此时splitOn需写成"USERNAMEID,GROUPID")。
你当前的SQL查询中已明确选择un.UserNameId和ga.GroupId,只要数据库中确实存在这两个列,且返回的列名与splitOn参数一致即可。
3. 确认实体属性与列的映射
确保Login、UserName、GroupAccess实体的属性能和结果集中的列正确对应:
Login实体应包含LoginId、Email属性(与SQL前两列对应)UserName实体应包含UserNameId、Name、CPF、CellPhone属性(与SQL中间四列对应)GroupAccess实体应包含GroupId、Name属性(与SQL最后两列对应)
如果属性名和列名不一致,可通过[Column]特性配置映射,例如:
public class UserName { [Column("UserNameId")] public int Id { get; set; } // 其他属性... }
内容的提问来源于stack exchange,提问作者Igor Vilhena
相关产品推荐
相关产品推荐

