Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 为什么SingleOrDefault结果在SQL中排名前(2)?_Entity Framework_Tsql - Fatal编程技术网

Entity framework 为什么SingleOrDefault结果在SQL中排名前(2)?

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

我正在使用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].[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。。。