Entity framework 为什么SingleOrDefault结果在SQL中排名前(2)?
我正在使用EF4.0,并编写了一个查询:Entity framework 为什么SingleOrDefault结果在SQL中排名前(2)?,entity-framework,tsql,Entity Framework,Tsql,我正在使用EF4.0,并编写了一个查询: var query = context.Post.Where(p => p.Id == postId).SingleOrDefault(); 我只需要从这个查询一个职位。我原以为SingleOrDefault()会生成“SELECT TOP(1)…”,但当我查看SQL Profiler时,它是: exec sp_executesql N'SELECT TOP (2) [Extent1].[Id] AS [Id], [Extent1].[Tit
var query = context.Post.Where(p => p.Id == postId).SingleOrDefault();
我只需要从这个查询一个职位。我原以为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'
我想知道为什么EF会导致选择TOP(2)?我只需要一篇博文。它选择Top2,这样,如果数据库中实际上有2条或2条以上的记录,就会抛出异常。如果它只选择top 1,则无法出错。通过要求序列的
SingleOrDefault
,您要求的是以下行为:
- 如果序列正好包含
元素,则返回序列元素类型的0
默认值
- 如果序列正好包含
元素,则返回该元素1
- 如果序列包含的元素多于
,则抛出1
TOP(1)
可以增强前两部分的能力,但不能增强第三部分的能力。只有通过执行TOP(2)
才能准确区分1
记录和多于1
记录
如果您不想要或不需要上述behviour的第三部分,请改用
FirstOrDefault
,您可以使用:var query=context.Post.SingleOrDefault(p=>p.Id==postId)代码>我们正在使用NHibernate,我希望它能做到这一点,但它没有。。。它选择一切。。。Grrrrr。。。