2009-07-28 22 views
229

Tengo una pregunta sobre la consulta LINQ. Normalmente, una consulta devuelve un tipo IEnumerable. Si la devolución está vacía, no estoy seguro si es nula o no. No estoy seguro de si el siguiente ToList() arrojará una excepción o solo una lista vacía <cadena> si no se encuentra nada en el resultado de IEnumerable?¿Qué devuelve LINQ cuando los resultados están vacíos?

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.

+7

Supongo que el resultado es Enumerable.Empty? –

Respuesta

369

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

9

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

3

No va a lanzar una excepción, obtendrá una lista vacía.

16
var lst = new List<int>() { 1, 2, 3 }; 
var ans = lst.Where(i => i > 3); 

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

(Dump es de LinqPad)

+0

¡Exactamente! Obtendrá una mejor indicación de los hallazgos – netfed

+0

TIL 'Count()' también es un método, no solo la propiedad – heyNow

+0

¿No debería usar .Any() porque el recuento se enumerará a través de todos los elementos? – SHEePYTaGGeRNeP

5

Otros mensajes que aquí han dejado claro que el resultado es un "vacío" IQueryable, que ToList() será correctamente cambiar 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 encadenas juntos.

+1

"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 ingresé en otra consulta. Esto causó que la segunda consulta se lanzara sin importar en qué lo lancé porque no había ningún valor ingresado en la segunda consulta. – trevorc

6

En Linq-to-SQL, si intenta obtener el primer elemento en una consulta sin resultados, obtendrá el error sequence contains no elements. Puedo asegurarle que el error mencionado no es igual a object reference not set to an instance of an object. que en conclusión no, no volverá nula nula ya que no se puede decir sequence contains no elements siempre dirá object reference not set to an instance of an object;)

+0

Oh, tu explicación ayuda a comprender mejor. Gracias ! –

27

También puede comprobar el .Any() método:

if (!YourResult.Any()) 

Sólo una nota que se .Any aún recuperar los registros de la base de datos; haciendo un .FirstOrDefault()/.Where() será la misma sobrecarga, pero entonces podría atrapar los objetos devueltos de la consulta

+4

¿Dónde se menciona la pregunta en una base de datos? – cja

+2

Tendrás que preguntarle a quien editó, no mencioné ninguna base de datos :) – Noich

+0

El editor de puntos está haciendo sonido, DB o no. Creo que están diciendo '.Any()' simplemente te dirá si tienes algún registro coincidente, donde hacer una consulta real para encontrar un valor específico podría ser nulo cuando '.Any()' no. – vapcguy

Cuestiones relacionadas