Dapper是否支持传入无命名的标量类型参数?
Dapper两种传参方式的合法性说明
两种写法都是Dapper官方支持的合法传参方式,适用场景不同:
位置参数写法
你提到的第一种语法:db.Query<Thing>("Select * from Things where id=?", 1)是Dapper专门提供的匿名位置参数特性,完全可以正常使用,只要注意两个限制:
- 所有参数占位符统一写
?,传入参数的顺序必须和SQL中?的出现顺序完全一致 - 多参数场景直接按顺序逗号分隔传入即可,比如
db.Query<Thing>("Select * from Things where id=? and name=?", 1, "测试名称")
Dapper内部会自动将?替换为对应数据库适配的参数格式,不需要手动适配不同数据库的占位符规则。
- 所有参数占位符统一写
命名参数写法
第二种语法是Dapper最常用的传参方式:db.Query<Thing>("Select * from Things where id= @id", new {id=1});这种写法适用场景更广,优势也更明显:
- 不需要关注参数顺序,只要参数名和SQL中的占位符名称对应即可,参数较多时不容易出错
- 代码可读性更强,能直观看到每个参数的含义
- 支持更复杂的传参场景,比如直接传入实体类、IN查询的列表参数等,灵活度更高
用法建议
如果是单参数、简单查询的场景,两种写法按需选择即可;如果参数数量多、逻辑复杂,优先选择命名参数写法,可维护性更高。
内容的提问来源于stack exchange,提问作者Chris F Carroll
相关产品推荐
相关产品推荐

