我正在使用EF4.0,我写了一个查询:
var query = context.Post.Where(p => p.Id == postId).SingleOrDefault();
我只需要此查询中的一个帖子。我以为SingleOrDefault()会生成" SELECT TOP(1)...",但是当我查看SQL事件探查器时,它是:
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'
我想知道为什么EF会导致SELECT TOP(2)?我只需要一个帖子。
答案 0 :(得分:59)
它选择前2个,这样如果数据库中实际存在2个或2个以上的记录,则会抛出异常。如果它只选择前1,则无法输出错误。
答案 1 :(得分:24)
通过询问序列的SingleOrDefault
,您要求这种行为:
0
个元素,则返回序列元素类型的default
1
元素,则返回元素1
,则抛出执行TOP (1)
将赋予前两部分权力,但不是第三部分。只有通过TOP (2)
,我们才能区分完整的1
记录和超过1
记录。
如果您不想要或需要上述行为的第三部分,请使用FirstOrDefault
。