¿La secuencia no contiene elementos?


131

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 colocar 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 volver a colocarla en la base de datos. No puedo entender por qué podría encontrar una fila adecuada en una instancia, pero no en otra.

(Usando ASP.NET MVC y LINQ)


18
tienes que usar SingleOrDefault, devolverá nulo si no se devuelven elementos
Mahmoud Farahat

el error indica que no puede encontrar ningún elemento en dc.BlogPosts que coincida con el valor de ID. El ID no tiene valor o los elementos de su lista contienen ese elemento. Use SingleOrDefault o FirstOrDefault, estos devolverán un objeto nulo si no se encuentra ningún elemento en lugar de un error.
prd82

Respuestas:


32

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


2
Hizo eso y descubrí que, por alguna razón, la ID y la fecha se pasan como null \ new (0000-0000) desde la página de edición. La página está fuertemente escrita 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 aparecen en la página. ¿Podría ser esta la razón por la que los pasa como nulos \ nuevos?

2
¿De dónde esperabas que viniera la identificación?
Ryan Lundy el

8
A simple vista, realmente no estoy seguro> _ <Problema tonto realmente.

367

De " Corrección de error de LINQ: la secuencia no contiene elementos ":

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

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

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • Aggregate()

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

55
¡Perfecto! ctx.Rosters.First(c => c.RosterAccess == accCode);<- roto ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<- TRABAJADO
Ravi Ram

2
En mi caso, estaba haciendo una Maxsecuencia vacía
guzart el

1
Así que ahora sabemos que cada voto ascendente pesa (en este momento) 31.25 libras.
B. Clay Shannon

2
¿Estás seguro de que LastOrDefault()eso también puede provocar ese error? Por qué ? Pensé que el "OrDefault" era el punto
Robouste

22

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.


2
En caso de llamada asíncrona, use .FirstOrDefaultAsync ();
Andrea Girardi

12

Bueno, que hay IDaqui? En particular, ¿es una variable local? Hay algunos problemas de alcance / captura, lo que significa que puede ser conveniente utilizar 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 se trata de LINQ-to-SQL, en la versión actual obtendrá un comportamiento ligeramente mejor si utiliza el formulario:

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

ID es un GUID que se pasa como argumento

10

Esto solucionará el problema,

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

8

Además de todo lo que se ha dicho, puede llamar DefaultIfEmpty()antes de llamar Single(). Esto asegurará que su secuencia contenga algo y, por lo tanto, evite la InvalidOperationException "La secuencia no contiene elementos". Por ejemplo:

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

2

Tuve una situación similar en una función que calcula el promedio.

Ejemplo:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();

Caso resuelto:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();

1

Motivo del error:

  1. La consulta from p in dc.BlogPosts where p.BlogPostID == ID select pdevuelve 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 el paso 1 que no contiene elementos.

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

Reparar:

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

devuelve una secuencia con al menos un elemento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.