2009-08-24 25 views
83

Actualmente estoy usando una sola consulta en dos lugares para obtener una fila de una base de datos.La secuencia no contiene elementos?

BlogPost post = (from p in dc.BlogPosts 
       where p.BlogPostID == ID 
       select p).Single(); 

La consulta está bien cuando a recuperar la fila para poner los datos en los cuadros de texto, pero devuelve un error "secuencia no contiene elementos" cuando se utiliza para recuperar la fila con el fin de editarlo y poner de nuevo en la base de datos. No puedo entender por qué podría encontrar una fila apropiada en una instancia pero no en otra.

(mediante ASP.NET MVC y LINQ)

+11

tiene que usar SingleOrDefault, devolverá nulo si no se devolvieron los elementos –

Respuesta

23

Deja un punto de interrupción en esa línea, o una Debug.Print antes de que, en tanto casos y ver qué ID contiene.

+0

Lo hizo y encontró que, por alguna razón, el ID y la fecha se pasan como null \ new (0000-0000) desde la página de edición. La página está fuertemente tipada como BlogPost. En la página de edición, solo tengo cuadros de texto para el título y el contenido, el ID y la fecha no se colocan en absoluto en la página. ¿Podría ser esta la razón por la que los pasa como null \ new? –

+0

¿De dónde esperabas que viniera la identificación? –

+6

A posterior vista, realmente no estoy seguro> _

11

Bueno, lo que es ID aquí? En particular, ¿es una variable local? Hay algunos problemas de alcance/captura, lo que significa que puede ser deseable utilizar una segunda copia variables, sólo para la consulta:

var id = ID; 
BlogPost post = (from p in dc.BlogPosts 
       where p.BlogPostID == id 
       select p).Single(); 

también; si esto es LINQ a SQL, a continuación, en la versión actual se obtiene un comportamiento ligeramente mejor si se utiliza la forma:

var id = ID; 
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id); 
+0

ID es un GUID pasado como un argumento –

251

De "Fixing LINQ Error: Sequence contains no elements":

When you get the LINQ Error "Sequence contains no elements", this is usually because you are using the First() or Single() command rather than FirstOrDefault() and SingleOrDefault() .

Esto también puede ser causada por los siguientes comandos:

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastOrDefault()
  • LastAsync()
  • Max()
+0

Esto solucionó mi problema. Gracias por el enlace! – CountMurphy

+3

¡Perfecto! 'ctx.Rosters.First (c => c.RosterAccess == accCode);' <- broken 'ctx.Rosters.FirstOrDefault (c => c.RosterAccess == accCode);' <- WORKED –

+1

In mi caso estaba haciendo un 'Max' sobre una secuencia vacía – guzart

8

Esto va a resolver el problema,

var blogPosts = (from p in dc.BlogPosts 
      where p.BlogPostID == ID 
      select p); 
if(blogPosts.Any()) 
{ 
    var post = post.Single(); 
} 
0

Motivo de error:

  1. La consulta devuelve una secuencia from p in dc.BlogPosts where p.BlogPostID == ID select p.

  2. Single() intenta recuperar un elemento de la secuencia devuelta en el paso1.

  3. Según la excepción - La secuencia devuelta en el paso 1 no contiene elementos.

  4. Single() intenta recuperar un elemento de la secuencia devuelta en el paso 1 que no contiene elementos.

  5. Dado que Single() no puede recuperar un solo elemento de la secuencia devuelta en el paso 1, arroja un error.

Fix:

Asegúrese de que la consulta (from p in dc.BlogPosts where p.BlogPostID == ID select p)

devuelve una secuencia con al menos un elemento.

4

Utilice

.FirstOrDefault() 

porque si en la primera fila del resultado no hay información esta instrucción va a la información por defecto.

Cuestiones relacionadas