LINQ: SingleOrDefault与FirstOrDefault()什么时候使用过滤条件

32 浏览
0 Comments

LINQ: SingleOrDefault与FirstOrDefault()什么时候使用过滤条件

考虑 SingleOrDefault()FirstOrDefault() 这两个 IEnumerable 扩展方法。

MSDN文档表明,SingleOrDefault:

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

FirstOrDefault from 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?

问题

在决定在 LINQ 查询中使用 SingleOrDefault()FirstOrDefault() 时,您遵循或建议遵循哪些约定?

admin 更改状态以发布 2023年5月21日
0
0 Comments

每当你使用 SingleOrDefault,你就清楚地表明查询结果最多只能有一个。另一方面,当使用 FirstOrDefault 时,查询可以返回任意数量的结果,但你声明你只要第一个结果。我个人认为语义非常不同,根据预期的结果使用适当的方法可以提高可读性。

0
0 Comments

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

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

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

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

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

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

结论:

如果你希望在结果集包含多条记录时抛出异常,请使用 SingleOrDefault

如果你始终希望返回 1 条记录,无论结果集包含什么,请使用 FirstOrDefault

0