2010-07-15 8 views
31

Si tengo una consulta de linq que se ve así, ¿cómo puedo verificar para ver si la consulta no encontró resultados?Si el resultado de Linq está vacío

var LinqResult = 
    from a in Db.Table 
    where a.Value0 == "ninja" 
    group a by a.Value1 into b 
    select new { Table = b}; 

if(LinqResult.Count() == 0) //? 
{ 

} 
+35

¿Por qué te molestas en buscar ninjas? Solo suponga que no puede encontrar ninguno. Nunca. – dlras2

Respuesta

82

Usted debe tratar de evitar el uso del método de Count() como una manera de comprobar si una secuencia está vacía o no. Phil Haack tiene an excellent article on his blog donde discute este antipatrón.

Count() debe enumerar todos los elementos de la secuencia, lo que puede ser costoso si la secuencia se basa en múltiples operaciones LINQ (o proviene de una base de datos).

En su lugar, debe usar el método de extensión Any(), que solo intenta ver si hay al menos un elemento en la lista, pero no enumera toda la secuencia.

if(!LinqResult.Any()) 
{ 
    // your code 
} 

Personalmente, también creo que el uso de Any() en lugar de Count() mejor expresa su intención, y es más fácil refactorizar o cambiar de forma fiable en el futuro.

Por cierto, si lo que realmente quiere es el primer (o único) miembro de la secuencia, debe utilizar los operadores First() o Single() en su lugar.

+1

A pesar de la percepción del artículo de que '.Any()' solo llama a '.MoveNext()' una vez, ReSharper (7) se quejará de posibles enumeraciones múltiples al usar '.Any()' seguido de otros métodos de enumeración. Tal vez ReSharper es inexacto o tiene como objetivo la hiper-eficiencia. –

+0

@CarlG: no todas las fuentes de datos de LINQ son flojas, por eso 'Any()' puede ser costoso. (Por ejemplo, en un resultado 'OrderBy', no guardará ningún momento) –

15
if(!LinqResult.Any()) //? 
{ 

} 
Cuestiones relacionadas