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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:35:20