关于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反而会掩盖根因,让系统存在隐患。

posted @ 2025-08-23 12:08  LeiCodeX  阅读(8)  评论(0)    收藏  举报