FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?
Posted
技术标签:
【中文标题】FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?【英文标题】:FirstOrDefault(), SingleOrDefault(), Any(), etc... Which One Is The Fastest? 【发布时间】:2012-06-14 23:10:00 【问题描述】:关于上述和/或包括其他方法,如果您正在搜索一条记录,并且只有一条记录存在,那么哪一个会执行得最快?例如,我想确保一旦它找到正在查询的值,我正在寻找一个会立即返回它而不搜索剩余记录的值。
【问题讨论】:
取决于查询提供者。Any
不返回值,它返回一个标志,指示值是否存在。
Any() 不返回记录。 FirstOrDefault可能是获取单条记录的最快方式,但不保证只有一条记录。
很好。但为了安心,我假设它在找到匹配值后立即返回?
这些方法的语义不一样。
【参考方案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>
【讨论】:
最后一件事,如果不存在记录,是否返回空值?我“认为”它是我使用过的 Single(),当没有任何返回时抛出异常。 如果不存在记录,则 singleOrDefault 和 FirstOrDefault 都返回对象的默认值(大多数情况下为 null)。使用 .First 或 .Single 如果集合不包含匹配项,则会引发异常 另见...LINQ: When to use SingleOrDefault vs. FirstOrDefault with filtering criteria 和 When to use .First and when to use .FirstOrDefault with LINQ?【参考方案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
【讨论】:
以上是关于FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?的主要内容,如果未能解决你的问题,请参考以下文章
Dns.GetHostAddresses 与 First() 或 FirstOrDefault() 一起使用啥
FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?
为啥在 LINQ 中使用 First 而不是 FirstOrDefault? [复制]
为啥 LINQ 中的 LastOrDefault(predicate) 比 FirstOrDefault(predicate) 快