我们正在实现一些EF数据存储库,并且存在一些查询,其中包括 TOP 1
TOP 1
我已经阅读了许多建议使用.Take(1) 的帖子我正在审查的代码使用.First()
.Take(1)
.First()
我知道这两个对象分配都产生相同的结果,但是它们实际上都解析为相同的查询吗?当查询数据库时TOP 1,两个请求实际上都可以使用吗?还是他们将对枚举完全执行查询,然后简单地将集合中的第一个条目录入?
此外,如果我们使用过,.FirstOrDefault()那为什么还要期待任何不同的行为呢?我知道,当使用一个IEnumerable,调用一个.First()在一个空的集合会抛出,但如果这 是 实际上只更改查询包括TOP 1话,我应该会之间绝对没有任何功能上的差异.First()和.FirstOrDefault()....对不对?
.FirstOrDefault()
或者,是否有比这些可枚举范围更好的方法来使查询执行TOP 1?
从LINQPad:
C# :
age_Centers.Select(c => c.Id).First(); age_Centers.Select(c => c.Id).FirstOrDefault(); age_Centers.Select(c => c.Id).Take(1).Dump();
SQL :
SELECT TOP (1) [t0].[Id] FROM [age_Centers] AS [t0] GO SELECT TOP (1) [t0].[Id] FROM [age_Centers] AS [t0] GO SELECT TOP (1) [t0].[Id] FROM [age_Centers] AS [t0]
*请注意,该方法Take(1)枚举并返回IQueryable。
Take(1)
IQueryable