2012-08-07 18 views
30

estoy usando EF4.0, y yo escribimos una consulta:¿Por qué resultado SingleOrDefault TOP (2) en SQL?

var query = context.Post.Where(p => p.Id == postId).SingleOrDefault(); 

que sólo necesitan un post de esta consulta. Pensé SingleOrDefault() generará "SELECT TOP (1) ...", pero cuando miro en el Analizador de SQL, que era:

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' 

Me pregunto por qué EF resultado de SELECT TOP (2)? Solo necesito una publicación.

+2

Y podría usar: 'var query = context.Post.SingleOrDefault (p => p.Id == postId);' – Malmi

+0

Estamos utilizando NHibernate, que esperaba hacer esto, pero no lo hace ... Selecciona todo ... Grrrrr ... –

Respuesta

48

Selecciona las 2 principales de modo que si realmente hay 2 o más de 2 registros en la base de datos, se lanzará una excepción. Si solo selecciona la parte superior 1, no habría forma de error.

17

Al pedir la SingleOrDefault de una secuencia, que está pidiendo este comportamiento:

  • si la secuencia tiene exactamente 0 elementos, devuelva el default de la secuencia de elemento de tipo
  • si la secuencia tiene exactamente 1 elemento, devolver el elemento
  • si la secuencia tiene más de 1 elemento, tirar

Hacer un TOP (1) habilitaría las dos primeras partes de esto, pero no el tercero. Solo haciendo un TOP (2) podemos diferenciar exactamente entre el registro 1 y el registro de más de 1.

Si no lo hace deseo o necesidad la tercera parte de la behviour arriba, en lugar de utilizar FirstOrDefault.

Cuestiones relacionadas