¿La secuencia no contiene elementos?

Actualmente estoy usando una sola consulta en dos lugares para obtener una fila de una base de datos.

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

La consulta está bien cuando se recupera la fila para poner datos en los cuadros de texto, pero devuelve un error “La secuencia no contiene elementos” cuando se usa para recuperar la fila para editarla y volverla a poner en la base de datos. No puedo entender por qué podría encontrar una fila apropiada en una instancia pero no en otra.

(Usando ASP.NET MVC y LINQ)

Coloque un punto de interrupción en esa línea, o una Debug.Print anterior, en ambos casos y vea qué ID contiene.

De ” Fixing LINQ Error: La secuencia no contiene elementos “:

Cuando obtiene el error LINQ “La secuencia no contiene elementos”, esto se debe generalmente a que está utilizando el comando First() o Single() lugar de FirstOrDefault() y SingleOrDefault() .

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

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastOrDefault()
  • LastAsync()
  • Max()
  • Min()

Bueno, ¿qué es ID aquí? En particular, ¿es una variable local? Hay algunos problemas de scope / captura, lo que significa que puede ser conveniente usar una segunda copia variable, solo 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-to-SQL, en la versión actual obtendrá un comportamiento ligeramente mejor si usa el formulario:

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

Esto solucionará el problema,

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

Por favor use

 .FirstOrDefault() 

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

Motivo de error:

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

  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. Como Single() no puede recuperar un solo elemento de la secuencia devuelta en el paso 1, arroja un error.

Fijar:

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.