【问题标题】:In Linq, is Single() after a Where clause useful?在 Linq 中,在 Where 子句之后的 Single() 有用吗?
【发布时间】:2018-08-07 08:35:34
【问题描述】:

有些事情我真的找不到答案:

db.Sensors.Where(s => s.Id == id).Single();

这里的 Single() 有必要吗?通常只会给出一个结果,但真的有必要添加它还是多余的?最佳做法是什么?

【问题讨论】:

  • Single() 用于从Sensor 返回单个对象,Where 返回IEnumerable<Sensor>。
  • 这取决于您的用例。然而Where 总是返回一个IEnumerable,而Single 返回一个实例。我们不知道您需要什么。
  • Where 可能不返回任何内容或对象数组。 Single 确保您的查询返回一个且仅一个结果。
  • 你可以通过 .Single(s => s.Id == id); 得到同样的结果。
  • 另外,请参阅此线程以供参考:stackoverflow.com/questions/2724096/linq-single-vs-first

标签: c# linq


【解决方案1】:

您可以将它们组合起来:

db.Sensors.Single(s => s.Id == id);

【讨论】:

    【解决方案2】:

    在您的特定情况下可能没有必要,但 Single() 强制只能有一个结果,如果结果多于或少于一个,则会抛出异常。在某些情况下,多于或少于一个结果会突出显示错误,那么这可能很有用。

    来自 MSDN:

    单(IEnumerable)

    返回一个序列的唯一元素,如果序列中不完全是一个元素,则抛出异常。

    Single(IEnumerable, Func)

    返回序列中唯一满足指定条件的元素,如果存在多个这样的元素,则抛出异常。

    【讨论】:

    • "...如果多于一个" - 或少于一个会抛出异常
    【解决方案3】:

    Where 返回一个 IEnumerable,其中 Single 返回一个对象,如果有 0 个或多个对象则抛出异常,正如其他答案所暗示的那样 -

    但是注意:这意味着它必须检查所有对象,因此会降低性能 - 如果您确信只有一个对象(即数据库上存在唯一约束),那么您可以使用 First()取而代之的是,获取单个对象,而不必费心检查所有其他对象的重复项。

    【讨论】:

    • 这是一个很好的见解,我没有想到这一点。谢谢,我会考虑的:)
    【解决方案4】:

    当您认为 Single() 应该明确地始终返回 1 条记录时,请使用它。这将帮助您避免逻辑错误。

    如果您确定 db.Sensors.Where(s => s.Id == id) 将返回一条且仅一条记录,则不需要 Single()。

    如果 db.Sensors.Where(s => s.Id == id) 返回 null 或,Single() 将抛出异常 不止一排。 Single() 将通过抛出异常来帮助您知道它返回的不是一行或 null。

    【讨论】:

      【解决方案5】:

      是的。有不同的光。

      methodWhere 返回一个IEnumerable,表示包含零个或仅包含与您的ID 匹配的对象的列表

      methodSingle 返回单个 object。但如果没有一个对象或多个对象与您的ID 匹配,则会引发异常。

      根据您的要求,如果需要循环列表,请使用Where,如果需要获取对象,请使用Single

      你选择了你的方法

      【讨论】:

      • 如果有多个对象匹配条件,SingleOrDefault 仍然会抛出异常
      • 是的,但问题是关于 ID 的比较。
      • 所以?您不知道 ID 是主键,或者确实有任何索引,无论是否唯一,来自问题...
      猜你喜欢
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多