使用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
相关产品推荐
相关产品推荐

