Dapper的QuerySingle和SingleOrDefault有什么区别 Dapper查询单行数据

QuerySingle要求结果必须且仅有一行,否则抛异常;QuerySingleOrDefault允许零行(返回默认值)但拒绝多行。二者异步版本行为一致。

QuerySingle 和 QuerySingleOrDefault 都是用来查单行数据的,核心区别在于“空结果”和“多结果”时的行为不同。

QuerySingle:严格要求恰好一行

它期望查询结果**必须且只能有一行**。不满足就直接抛异常:

  • 没查到任何记录 → 抛 InvalidOperationException
  • 查到两行或更多 → 同样抛 InvalidOperationException
  • 查到刚好一行 → 正常返回映射后的对象

适合业务上逻辑上必须存在唯一结果的场景,比如根据主键查用户:SELECT * FROM Users WHERE Id = @id

QuerySingleOrDefault:允许为空,但不容许多

它接受“没有结果”,但依然拒绝“多个结果”:

  • 没查到任何记录 → 返回类型的默认值(引用类型为 null,int 为 0,bool 为 false
  • 查到两行或更多 → 抛 InvalidOperationException
  • 查到刚好一行 → 正常返回映射后的对象

适合可能不存在、但绝不可能重复的查询,比如按唯一邮箱查用户:SELECT * FROM Users WHERE Email = @email

对比小结(以 User 类型为例)

QuerySingle("...")
→ 有1条:返回 User 实例
→ 0条 或 ≥2条:全部报错

QuerySingleOrDefault("...")
→ 有1条:返回 User 实例
→ 0条:返回 null
→ ≥2条:报错

别忘了异步版本

生产环境建议优先用异步方法:

  • QuerySingleAsync()QuerySingleOrDefaultAsync()
  • 行为逻辑与同步版完全一致,只是返回 Task

基本上就这些。