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


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


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


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 )


¡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


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


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.


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

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.