LINQ中何时使用SingleOrDefault与FirstOrDefault()?

  • 回答 (2)
  • 关注 (0)
  • 查看 (686)

考虑IEnumerable扩展方法SingleOrDefault()和FirstOrDefault()

MSDN文档SingleOrDefault:

返回序列的唯一元素,如果序列为空,则返回默认值; 如果序列中有多个元素,则此方法将引发异常。

而FirstOrDefault从MSDN(推测当使用OrderBy()或 OrderByDescending()或根本没有),

返回序列的第一个元素

考虑一些示例查询,使用这两种方法时并不总是很清楚:
var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE
var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?
var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?

问题

使用SingleOrDefault()和FirstOrDefault()LINQ查询时遵循什么约定?

京东售后京东售后提问于
秋之夕颜清念念不忘,必有回响回答于

如果结果集返回0个记录:

  • SingleOrDefault 返回类型的默认值(例如,默认值为0)
  • FirstOrDefault 返回类型的默认值

如果结果集返回1记录:

  • SingleOrDefault 返回该记录
  • FirstOrDefault 返回该记录

如果你的结果集返回许多记录:

  • SingleOrDefault 抛出异常
  • FirstOrDefault 返回第一条记录

结论:

如果要在结果集包含许多记录时引发异常,请使用SingleOrDefault。

如果您总是需要1条记录,无论结果集包含什么,请使用 FirstOrDefault

心愿回答于

每当你使用SingleOrDefault,你清楚地表明,查询应该导致最多只有一个结果。另一方面,当FirstOrDefault使用时,查询可以返回任意数量的结果,但是您声明只需要第一个结果。

我个人发现语义非常不同,使用适当的语义,取决于预期的结果,提高了可读性。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问36 回答
  • 富有想象力的人

    3 粉丝0 提问30 回答
  • 学生

    3 粉丝476 提问28 回答
  • o o

    4 粉丝494 提问27 回答

扫码关注云+社区

领取腾讯云代金券