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

使用Dapper QueryAsync传递多参数报错,需排查userClientIds问题

问题排查与修复方案

核心错误点分析

  • IN子句参数传递错误:你将userClientIds包装成了new[] { userClientIds },形成了列表的嵌套数组,Dapper无法正确解析这种结构。直接传入原始userClientIds列表即可,Dapper会自动将列表转换为IN子句所需的格式。
  • LIKE语句参数引用错误:你把参数@searchedEmpName写在了字符串常量'%@searchedEmpName%'内部,这会被SQL当成普通字面量而非参数。需要改成参数与通配符拼接的形式。
  • 参数传递容器错误:调用QueryAsync时,你传递了new { parameters },将DynamicParameters包装成了匿名对象的属性,Dapper无法识别其中的参数,直接传入parameters对象即可。
  • Guid类型无需转字符串:userId是Guid类型,Dapper可以直接映射到SQL的uniqueidentifier类型,不需要调用ToString()转换。

修复后的完整代码

public async Task<IEnumerable<SharedUser>> GetUsersForSharing(Guid userId, Guid templateId, string? searchedEmpName, string? searchedEmpNumber)
{
    // 提取ClientId列表
    var userClientIds = userClients.Select(client => client.ClientId).ToList();

    var sql = $@"SELECT DISTINCT
            UserId, 
            ClientId,
            FullName,
            EmployeeNumber
        FROM dbo.ClientUser
        WHERE 
            UserId <> @UserId
            AND ClientId IN @userClientIds";

    if (!string.IsNullOrEmpty(searchedEmpName))
    {
        // 正确拼接LIKE条件,参数与通配符分离
        sql += $@" AND FullName LIKE '%' + @searchedEmpName + '%'";
    }
    if (!string.IsNullOrEmpty(searchedEmpNumber))
    {
        sql += $@" AND EmployeeNumber LIKE '%' + @searchedEmpNumber + '%'";
    }
    
    using(var conn = _connectionFactory.GetDbConnection())
    {
        var parameters = new DynamicParameters();
        parameters.Add("@UserId", userId);
        parameters.Add("@userClientIds", userClientIds);
        parameters.Add("@searchedEmpName", searchedEmpName);
        parameters.Add("@searchedEmpNumber", searchedEmpNumber);
        
        conn.Open();
        var result = await conn.QueryAsync<SharedUser>(sql, parameters);
        return result;
    }
}

可选优化方案

如果你的SQL Server版本支持,也可以在参数值中预先添加通配符,简化SQL语句:

// 参数赋值时添加通配符
if (!string.IsNullOrEmpty(searchedEmpName))
{
    parameters.Add("@searchedEmpName", $"%{searchedEmpName}%");
    sql += " AND FullName LIKE @searchedEmpName";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:27:33