¿Qué devuelve LINQ cuando los resultados están vacíos?

319

Tengo una pregunta sobre la consulta LINQ. Normalmente una consulta devuelve un IEnumerable<T>tipo. Si la devolución está vacía, no estoy seguro si es nula o no. No estoy seguro de si lo siguiente ToList()arrojará una excepción o solo un vacío List<string>si no se encuentra nada en el IEnumerableresultado.

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

Sé que es una pregunta muy simple, pero no tengo VS disponible por el momento.

David.Chu.ca
fuente
11
Supongo que el resultado es Enumerable. ¿Vacío?
David.Chu.ca

Respuestas:

512

Devolverá un enumerable vacío. No será nulo. Puedes dormir sonido :)

leppie
fuente
38

También puedes consultar el .Any()método:

if (!YourResult.Any())

Solo una nota que .Anyaún recuperará los registros de la base de datos; hacer una .FirstOrDefault()/.Where()será igual de sobrecarga pero luego podrá capturar los objetos devueltos por la consulta

Noich
fuente
55
¿Dónde menciona la pregunta una base de datos?
cja
44
Tendrás que preguntarle al que editó, no mencioné ningún DB :)
Noich
Sin embargo, el editor de puntos está haciendo sonido, DB o no. Creo que lo que dicen .Any()es que solo le dirá si tiene algún registro coincidente, en absoluto, dónde hacer una consulta real para encontrar un valor específico podría ser nulo cuando .Any()no lo es.
vapcguy
1
La edición en realidad podría estar equivocada. Si usa linq para entidades, el db podría atajar esto y no se enviarán datos al cliente, excepto un verdadero o falso
Mafii
19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(El volcado es de LinqPad )

JP Alioto
fuente
¡Exactamente! Obtendrá una mejor indicación de los hallazgos
netfed
TIL Count()también es un método, no solo la propiedad
heyNow
2
¿No deberías usar .Any () porque count enumerará todos los elementos?
SHEePYTaGGeRNeP
16

.ToList devuelve una lista vacía. (igual que la nueva Lista ());

Paul van Brenk
fuente
8

En Linq-to-SQL, si intenta obtener el primer elemento en una consulta sin resultados, obtendrá un sequence contains no elementserror. Les puedo asegurar que el error mencionado no es igual a object reference not set to an instance of an object. en conclusión no, no devolverá nulo ya que nulo no puede decir sequence contains no elementsque siempre dirá object reference not set to an instance of an object;)

kay.one
fuente
1
Oh, tu explicación ayuda a una mayor comprensión. Gracias !
Kay Lee
¿Responde esto la pregunta?
ChiefTwoPencils
7

Otras publicaciones aquí han dejado en claro que el resultado es un IQueryable "vacío", que ToList () cambiará correctamente para ser una lista vacía, etc.

Tenga cuidado con algunos de los operadores, ya que lanzarán si les envía un enumerable vacío. Esto puede suceder cuando los encadena juntos.

Spence
fuente
3
"Tenga cuidado con algunos de los operadores, ya que lanzarán si les envía un enumerable vacío. Esto puede suceder cuando los encadena". - Esto es lo que me atrapó. Tenía un valor devuelto nulo que luego introduje en otra consulta. Esto provocó que la segunda consulta se lanzara sin importar a qué la enviara porque no se introdujo ningún valor en la segunda consulta.
trevorc
6

No arrojará excepciones, obtendrá una lista vacía.

Jimmy Chandra
fuente