QueryFirst要求必须有结果,否则抛InvalidOperationException异常;QueryFirstOrDefault查无结果时返回默认值,更安全。仅当100%确定数据存在时用QueryFirst,如主键查询;多数场景推荐QueryFirstOrDefault。
两者都用于执行查询并返回单个结果,但对“查不到数据”这一情况的处理完全不同:
InvalidOperationException 异常。null,int 是 0,bool 是 false。仅在你**100%确定某条记录必然存在**时才用它。典型场景包括:
SELECT * FROM Users WHERE Id = @id),且已确认该 ID 在库中一定有值;SELECT COUNT(*) FROM Orders 配合 QueryFirst;现实开发中,绝大多数查询都无法提前保证数据一定存在。用 QueryFirst 容易因一条缺失数据导致整个接口崩溃。
var user = conn.QueryFirstOrDefault(...); if (user == null) { ... } 。QueryFirst / FirstOrDefa
ult 关注的是“取第一个”,不管后面还有没有其他行;而 QuerySingle / SingleOrDefault 要求结果**有且仅有一行**,多于一行也会报错。
QuerySingleOrDefault,因为期望最多一个;QueryFirstOrDefault("SELECT TOP 1 ... ORDER BY Created DESC") ;QueryFirst("SELECT COUNT(...)") 更合适,因为 COUNT 永远返回一行。基本上就这些。选哪个不是看名字顺口,而是看你的查询语义和容错需求。