使用Entity Framework,最好使用.First()或.Take(1)作为"TOP 1"吗?

Mat*_*hew 38 sql linq ienumerable linq-to-objects entity-framework

我们正在实现一些EF数据存储库,我们有一些查询包括 TOP 1

我已经阅读了许多建议使用.Take(1)
我正在审查的代码使用的帖子.First()

我知道这两个都会为对象赋值产生相同的结果,但它们是否实际上都解析为同一个查询?查询数据库时,它实际上是否同时TOP 1用于两个请求?或者他们会将查询完整地执行到可枚举中,然后只需获取集合中的第一个条目?

此外,如果我们使用.FirstOrDefault()那么为什么我们应该期待任何不同的行为?我知道,当使用一个IEnumerable,调用一个.First()在一个空的集合会抛出,但如果这实际上只更改查询包括TOP 1话,我应该会完全没有功能上的差异之间.First().FirstOrDefault()....对不对?

或者,是否有比这些Enumerable扩展更好的方法来执行查询TOP 1

ken*_*ken 70

来自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();
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

*注意Take(1)枚举并返回一个IQueryable.

  • +1表示他们创建相同的查询结果. (6认同)
  • 那么query.Skip(10).Take(1)?这三个查询是否相同? (3认同)

Ica*_*rus 5

将DataContext Log属性重定向到Console.Out或TextFile,并查看每个选项生成的查询.

  • 这可能是一个评论,对吧? (4认同)
  • @dasblinkenlight不,事实并非如此.我认为这是一个有效的答案.我告诉OP如何自己找到答案; 容易. (4认同)