FirstOrDefault(),SingleOrDefault(),Any()等......哪一个是最快的?

时间:2012-06-14 23:10:01

标签: .net linq

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

2 个答案:

答案 0 :(得分:15)

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

FirstOrDefault枚举集合,直到找到匹配的项目

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

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

编辑:

任何可以更快地实现。 Concider一个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>

答案 1 :(得分:1)

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

Select Top 2 * from table

另一方面,第一次匹配后,通常会发生短路。在TSQL中

Select Top 1 * from table

任何用于指示是否找到至少一个匹配(并在找到之后发生短路)。在TSQL中,它使用Exists。

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

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

从存在的表格中选择1