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 al recuperar la fila para poner datos en los cuadros de texto, pero devuelve un error "Sequence contains no elements" cuando se usa para recuperar la fila para editarla y volver a colocarla en la base de datos. No puedo entender por qué podría encontrar una fila apropiada en un caso pero no en otro.

(Utilizando ASP.NET MVC y LINQ)

 97
Author: David Basarab, 2009-08-24

7 answers

Ponga un punto de interrupción en esa línea, o una depuración.Imprima antes, en ambos casos y vea lo que contiene ID.

 25
Author: Ryan Lundy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-24 19:23:46

Desde " Arreglando el error LINQ: La secuencia no contiene elementos":

Cuando obtienes el error LINQ "Sequence contains no elements", esto es generalmente porque estás usando el comando First() o Single() en lugar de FirstOrDefault() y SingleOrDefault().

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

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastOrDefault()
  • LastAsync()
  • Max()
  • Min()
 286
Author: Tony Kiernan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-20 11:12:41

Bueno, ¿qué es ID aquí? En particular, ¿es una variable local? Hay algunos problemas de alcance / captura, lo que significa que puede ser deseable usar una segunda copia de 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, entonces 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);
 11
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-24 19:24:13

Esto resolverá el problema,

var blogPosts = (from p in dc.BlogPosts
             where p.BlogPostID == ID
             select p);
if(blogPosts.Any())
{
  var post = post.Single();
}
 8
Author: Diganta Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-16 00:31:40

Utilice

.FirstOrDefault()

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

 7
Author: Josue Morales,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-01 01:48:49

Razón del 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 paso 1.

  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 step1 que no contiene elementos.

  5. Dado que Single() no es capaz de obtener un solo elemento de la secuencia devuelta en el paso 1, lanza un error.

Arreglo:

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.

 0
Author: Siddarth Kanted,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-27 05:53:24

Además de todo lo demás que se ha dicho, puedes llamar DefaultIfEmpty() antes de llamar Single(). Esto asegurará que su secuencia contenga algo y, por lo tanto, evitará la excepción InvalidOperationException "Sequence contains no elements". Por ejemplo:

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).DefaultIfEmpty().Single();
 0
Author: bryc3m0nk3y,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-24 02:04:12