QueryFirst 和 QueryFirstOrDefault 的核心区别
两者都用于执行查询并返回单个结果,但对“查不到数据”这一情况的处理完全不同:
QueryFirst:要求数据库中必须至少有一行匹配结果。如果没查到,直接抛出InvalidOperationException异常。 QueryFirstOrDefault:允许查不到数据。此时不报错,而是返回对应类型的默认值——比如引用类型是
null,
int是
0,
bool是
false。
什么时候该用 QueryFirst
仅在你**100%确定某条记录必然存在**时才用它。典型场景包括:
根据主键查询(如SELECT * FROM Users WHERE Id = @id),且已确认该 ID 在库中一定有值; 聚合查询后必有结果,比如
SELECT COUNT(*) FROM Orders配合
QueryFirst<int></int>; 业务逻辑强制约束下不可能为空的数据,例如系统配置表的默认项。
为什么多数时候推荐 QueryFirstOrDefault
现实开发中,绝大多数查询都无法提前保证数据一定存在。用 QueryFirst 容易因一条缺失数据导致整个接口崩溃。
查用户信息时 ID 输错、被删除,用 First 会炸,用 FirstOrDefault 返回 null 后可友好提示“用户不存在”; 关联查询中外键可能为空,或条件筛选后无匹配,用 FirstOrDefault 更安全; 配合 if 判断更自然:var user = conn.QueryFirstOrDefault<user>(...); if (user == null) { ... }</user>。
别和 Single 系列混淆
QueryFirst / FirstOrDefault 关注的是“取第一个”,不管后面还有没有其他行;而 QuerySingle / SingleOrDefault 要求结果**有且仅有一行**,多于一行也会报错。
查邮箱唯一性验证?用QuerySingleOrDefault<user></user>,因为期望最多一个; 查最新一条订单?用
QueryFirstOrDefault<order>("SELECT TOP 1 ... ORDER BY Created DESC")</order>;
查统计总数?用 QueryFirst<int>("SELECT COUNT(...)")</int> 更合适,因为 COUNT 永远返回一行。
基本上就这些。选哪个不是看名字顺口,而是看你的查询语义和容错需求。
