FirstOrDefault(), SingleOrDefault(), Any(), etc… Which One Is The Fastest?
在两个以上regards和/或其他方法包括,如果你在搜索一条记录,记录是否一只,这将是一fastest perform吗?例如,我想确保这一次它的价值被认定queried,我在寻找一个好的回报,将网络中的搜索通没有剩余的记录。
- 这取决于查询提供程序。
- Any不返回值,它返回一个标志,指示值是否存在。
- any()不返回记录。FirstOrDefault可能是获得单个记录的最快方法,但不能保证只有一个记录。
- 好抓…但为了内心的平静,我假设它一找到匹配的值就返回?
- 这将是明智的实施。你可以假设是这样的。
- 这些方法的语义不同。
- Linq的良好阅读能力:何时使用SingleOrDefault与使用筛选条件的FirstOrDefault,何时使用.First以及何时使用.FirstOrDefault与Linq?
- 重申:这取决于查询提供者。当查询提供者被要求扫描整个表时,没有什么能阻止它的实现者选择扫描整个表。当然,这将是一个反常和不受欢迎的事情,但他们承诺的只是调用的语义,而不是它的实现。对于特定的查询提供者来说,这是一个非常好的问题。关于扩展示例,请参阅jon skeet的edulinq系列,进一步了解linq to objects的作用。
如果你想一想,你可能会想出来的。
FirstOrDefault枚举集合,直到找到匹配项为止。
SingleOrDefault枚举整个集合,以确保该项恰好发生一次
这意味着SingleOrDefault不能比FirstOrDefault快。但它确实稍微依赖于查询提供者的实现
编辑:
任何一个都可以更快地实现。协调SQL实现:
1
| Select Top 1 from myTable //(its not quite this but this implementation but it will be similar) |
执行速度将超过:
1
| Select Top 1 from myTable where <somecondition> |
- 最后一件事,如果不存在记录,是否返回空值?我"认为"我用过的是single(),当没有任何东西返回时,抛出了一个异常。
- 如果不存在任何记录,则singleOrDefault和firstOrDefault都返回对象的默认值(在大多数情况下,这是空的)。如果集合不包含匹配项,则使用.first或.single引发异常
- 也见…Linq:何时使用带筛选条件的SingleOrDefault与FirstOrDefault,何时使用.First以及何时使用带Linq的.FirstOrDefault?
只有当您希望在结果为0或多个时强制执行异常时,才应使用single(和singleOrDefault)。典型的SQL实现是
1
| Select Top 2 * from table |
另一方面,第一次匹配后通常会短路。在TSQL
1
| Select Top 1 * from table |
Any用于指示是否找到至少一个匹配项(找到后短路)。在TSQL中,它使用exists。
在您的情况下,由于您需要结果值,所以在单独发出请求(使用any)然后执行single时没有任何用处。相反,只需使用first或default,然后检查返回结果是否为空。
1 2 3
| var foo = table.FirstOrDefault(t => t.bar == val);
if (null != foo)
... |
从存在的表中选择1