¿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)

David Basarab
fuente
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.

Ryan Lundy
fuente
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()
Tony Kiernan
fuente
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.

Josue Morales
fuente
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);
Marc Gravell
fuente
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();
}
Diganta Kumar
fuente
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();
bryc3m0nk3y
fuente
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();
Mihai Cristian
fuente
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.

Siddarth Kanted
fuente