为了账号安全,请及时绑定邮箱和手机立即绑定

Linq:在筛选条件下何时使用SingleOrDefault与FirstOrDefault()

Linq:在筛选条件下何时使用SingleOrDefault与FirstOrDefault()

子衿沉夜 2019-07-13 19:03:37
考虑IEnenable扩展方法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 BEvar 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查询中?

3 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

无论何时你使用SingleOrDefault,您可以清楚地指出,查询最多应该导致单株结果。另一方面,当FirstOrDefault使用时,查询可以返回任意数量的结果,但您只需要第一个结果。

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


查看完整回答
反对 回复 2019-07-13
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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

  • SingleOrDefault

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

    返回类型的默认值。

如果结果集返回1条记录:

  • SingleOrDefault

    返回记录
  • FirstOrDefault

    返回记录

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

  • SingleOrDefault

    抛出异常
  • FirstOrDefault

    返回第一条记录

结论:

如果希望在结果集包含许多记录的情况下引发异常,请使用SingleOrDefault.

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


查看完整回答
反对 回复 2019-07-13
?
慕村225694

TA贡献1880条经验 获得超4个赞

的确有

  • 语义差异
  • 性能差异

在两者之间。

语义差异:

  • FirstOrDefault

    返回第一项的潜在多个(或默认情况下,不存在)。
  • SingleOrDefault

    假设存在单个项并返回它(如果不存在则默认)。多项违反合同,引发异常。

性能差异

  • FirstOrDefault通常情况下,它的迭代速度更快,直到找到元素为止,并且只有在找不到元素时才需要迭代整个可枚举的元素。在许多情况下,很有可能找到一个项目。

  • SingleOrDefault需要检查是否只有一个元素,因此始终迭代整个枚举。准确地说,它迭代直到找到第二个元素并抛出一个异常。但在大多数情况下,没有第二个因素。

结语

  • 使用FirstOrDefault如果你不在乎有多少物品当您无法负担检查唯一性时(例如,在一个非常大的集合中)。当您检查将项添加到集合时的唯一性时,在搜索这些项时再次检查可能太昂贵了。

  • 使用SingleOrDefault如果您不需要太在意性能,并且希望确保单个项目的假设对读者来说是明确的,并在运行时进行检查。

在实践中,您可以使用First / FirstOrDefault通常情况下,当您假设一个项目,以提高性能。你还应该记得Single / SingleOrDefault可以提高可读性(因为它陈述了单个项目的假设)和稳定性(因为它检查了它)并适当地使用了它。


查看完整回答
反对 回复 2019-07-13

添加回答

代码语言

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信