Dapper通过集合参数自动展开实现安全高效的IN子句查询,支持任意类型、匿名对象及多集合混合使用,需防范空集合、null及SQL Server参数数限制。

Dapper 本身不直接支持 SQL 中 IN 子句的原生参数化(比如 WHERE id IN @ids),但提供了简洁、安全、高效的方式来实现——核心是利用 Dapper 对集合参数的自动展开能力。
用 IEnumerable 参数自动展开 IN 列表
Dapper 能识别传入的数组、List、HashSet 等集合类型,并在生成 SQL 时自动为每个元素生成独立参数,避免 SQL 注入。这是最常用也最推荐的方式。
- 写法示例:
SELECT * FROM Users WHERE Id IN @ids -
@ids传入new[] { 1, 2, 3 }或new List<int> { 1, 2, 3 }</int> - Dapper 内部会将其转为类似
WHERE Id IN (@ids_0, @ids_1, @ids_2),并绑定对应值 - 支持任意值类型(int、string、Guid、DateTime 等),也支持匿名对象属性
字符串拼接 IN 列表(不推荐,仅限只读低风险场景)
如果因特殊原因必须动态拼接(如兼容旧驱动、超大列表需分批),可用 string.Join + SqlMapper.GenerateInSql 辅助方法,但务必确保数据已清洗或来自可信源。
- Dapper 提供
SqlMapper.GenerateInSql工具方法,可安全生成带参数占位符的 IN 字符串 - 例如:
var sql = $"SELECT * FROM Products WHERE CategoryId IN {SqlMapper.GenerateInSql(categoryIds, "@cat")}" - 仍需手动传入
new { cat = categoryIds },不能跳过参数化 - 注意:SQL Server 对参数总数有限制(通常 ≤ 2100),超量需分批次查询
处理空集合或 null 的边界情况
传入空集合(new int[0])或 null 时,Dapper 默认会抛出异常或生成无效 SQL,需主动防御。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~