2010-07-15 18 views
31

Se ho una query linq simile a questa, come posso verificare se non ci sono risultati trovati dalla query?Se Linq Result è vuoto

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

Perché ti stai prendendo la briga di cercare i ninja? Supponi di non poterne trovare nessuno. Mai. – dlras2

risposta

82

Si dovrebbe evitare di utilizzare il metodo Count() come un modo per controllare se una sequenza è vuota o non. Phil Haack ha an excellent article on his blog dove parla di questo antipattern.

Count() devono effettivamente elencare tutti gli elementi della sequenza, che possono essere costosi se la sequenza è basata su più operazioni LINQ (o proviene da un database).

Dovresti utilizzare il metodo di estensione Any(), che tenta solo di vedere se c'è almeno un elemento nell'elenco, ma non enumererà l'intera sequenza.

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

Personalmente, penso anche che l'uso di Any() piuttosto che Count() meglio esprime il vostro intento, ed è più facile di refactoring o modificare in modo affidabile in futuro.

A proposito, se quello che effettivamente si desidera è il primo (o solo) membro della sequenza, è necessario utilizzare gli operatori First() o Single().

+1

Nonostante l'intuizione dell'articolo che '.Any()' chiama solo '.MoveNext()' una volta, ReSharper (7) si lamenterà di possibili enumerazioni multiple quando usa '.Any()' seguito da altri metodi di enumerazione. Forse ReSharper è impreciso o punta all'iper-efficienza. –

+0

@CarlG: non tutte le fonti di dati LINQ sono pigre, ecco perché 'Any()' potrebbe essere costoso. (Ad esempio, su un risultato 'OrderBy', non salverà nessun tempo) –

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

}