【问题标题】:FirstOrDefault(), SingleOrDefault(), Any(), etc... Which One Is The Fastest?FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?
【发布时间】:2012-06-14 23:10:00
【问题描述】:

关于上述和/或包括其他方法,如果您正在搜索一条记录,并且只有一条记录存在,那么哪一个会执行得最快?例如,我想确保一旦它找到正在查询的值,我正在寻找一个会立即返回它而不搜索剩余记录的值。

【问题讨论】:

  • 取决于查询提供者。
  • Any 不返回值,它返回一个标志,指示值是否存在。
  • Any() 不返回记录。 FirstOrDefault可能是获取单条记录的最快方式,但不保证只有一条记录。
  • 很好。但为了安心,我假设它在找到匹配值后立即返回?
  • 这些方法的语义不一样。

标签: .net linq


【解决方案1】:

如果你有这个想法,你可能会解决它。

FirstOrDefault 枚举集合直到找到匹配项

SingleOrDefault 枚举整个集合以确保项目恰好出现一次

这意味着SingleOrDefault 不能比FirstOrDefault 快。但它确实有点依赖于查询提供程序的实现

编辑:

任何都可以更快地实现。考虑一个 SQL 实现:

Select Top 1 from myTable //(its not quite this but this implementation but it will be similar)

将执行得比:

Select Top 1 from myTable where <somecondition>

【讨论】:

【解决方案2】:

只有当您想要在有 0 个或多个结果时强制异常时才应使用 Single(和 SingleOrDefault)。典型的 SQL 实现是

Select Top 2 * from table

另一方面,First 通常会在找到第一个匹配项后短路。在 TSQL 中

Select Top 1 * from table

Any 用于指示是否至少找到一个匹配项(并在找到后短路)。在 TSQL 中,这使用 Exists。

在您的情况下,由于您需要结果值,因此发出单独的请求(使用 Any)然后执行 Single 是没有用的。相反,只需使用 FirstOrDefault 然后检查返回结果是否为 null。

var foo = table.FirstOrDefault(t => t.bar == val);
if (null != foo)
   ...

从存在的表中选择 1

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多