关于EF中SingleOrDefault和FirstOrDefault一点思考
本文主要陈述了我在日常使用FirstOrDefault()和SingleOrDefault()的一些思考。
引入场景
不知道你是否也遇到下面的场景:
线上返回系统功能报错了,程序员通过日志等手段查到使用EF的SingleOrDefault()方法查询数据出现了异常。
当符合条件的数据多余1条时,SingleOrDefault就会引发异常,有的开发人员会把SingleOrDefault()改成了FirstOrDefault()。
报错解决了,系统又正常运行,皆大欢喜。
二者区别
暂不说我的观点,先来看他们两个的区别。
下面是一段实验代码。
using TestSingleAndFirstDefault;
using var db = new AppDbContext();
db.Database.EnsureCreated();
if (!db.Users.Any())
{
db.Users.Add(new User() { Name = "Leon Deng" });
db.SaveChanges();
}
var user1 = db.Users.SingleOrDefault(x=>x.Name == "Leon Deng");
var user2 = db.Users.FirstOrDefault(x=>x.Name == "Leon Deng");
打印两个查询的脚本
SingleOrDefault
SELECT "u"."Id", "u"."Name"
FROM "Users" AS "u"
WHERE "u"."Name" = 'Leon Deng'
LIMIT 2
FirstOrDefault
SELECT "u"."Id", "u"."Name"
FROM "Users" AS "u"
WHERE "u"."Name" = 'Leon Deng'
LIMIT 1
二者主要区别是:
- SingleOrDefault 查询符合条件的2条数据,当返回多余1条记录时,引发异常。
- FirstOrDefault 查询符合条件的1条数据,不会引发一次。
从脚本来看,二者区别不大,所以我不认为二者在性能上有很大的差异,大可不必考虑性能问题伤脑筋。
我的思考
最后,我认为,如果实际业务上就应该只有一条数据,那就要使用SingleOrDefault,用FirstOrDefault反而会掩盖根因,让系统存在隐患。
本文来自博客园,作者:LeiCodeX,转载请注明原文链接:https://www.cnblogs.com/denglei1024/p/19054264

浙公网安备 33010602011771号