为什么SingleOrDefault在SQL中导致TOP(2)?

Edi*_*ang 46 t-sql entity-framework

我正在使用EF4.0,我写了一个查询:

var query = context.Post.Where(p => p.Id == postId).SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

我只需要来自此查询的一个帖子.我以为SingleOrDefault()会生成"SELECT TOP(1)...",但是当我查看SQL Profiler时,它是:

exec sp_executesql N'SELECT TOP (2) 
[Extent1].[Id] AS [Id], 
[Extent1].[Title] AS [Title], 
[Extent1].[Slug] AS [Slug], 
[Extent1].[PubDate] AS [PubDate], 
[Extent1].[PostContent] AS [PostContent], 
[Extent1].[Author] AS [Author], 
[Extent1].[CommentEnabled] AS [CommentEnabled], 
[Extent1].[AttachmentId] AS [AttachmentId], 
[Extent1].[IsPublished] AS [IsPublished], 
[Extent1].[Hits] AS [Hits], 
[Extent1].[CategoryId] AS [CategoryId]
FROM [dbo].[Post] AS [Extent1]
WHERE [Extent1].[Id] = @p__linq__0',N'@p__linq__0 uniqueidentifier',@p__linq__0='ECD9F3BE-3CA9-462E-AE79-2B28C8A16E32'
Run Code Online (Sandbox Code Playgroud)

我想知道为什么EF导致SELECT TOP(2)?我只需要一个帖子.

Tod*_* Li 64

它选择前2,这样如果数据库中实际存在2个或2个以上的记录,则会抛出异常.如果它只选择前1,则无法输出错误.


Aak*_*shM 29

通过询问SingleOrDefault序列,您要求此行为:

  • 如果序列具有确切的0元素,则返回default序列的元素类型
  • 如果序列具有确切的1元素,则返回该元素
  • 如果序列有多个1元素,则抛出

做一个TOP (1)会赋予前两个部分,但不是第三部分.只有通过做一个TOP (2)can,我们才能区分精确1记录和1记录.

如果您想要或不需要上述行为的第三部分,请改用FirstOrDefault.

  • 解释比接受的答案好得多 (2认同)