2011-10-19 15 views
28

Solo quiero saber cuál es la mejor manera de verificar si un resultado IQueryable no tiene valores.Cuál es la mejor manera de verificar el conjunto de resultados IQueryable es nulo

por ejemplo. si tenemos un método como

public static IQueryable<Table> DisplayAll() 
{ 
    var db = new DataContext(); 
    var list= from data in db.Table select data; 
    return list; 
} 

y luego hacemos algo como esto

var list = DisplayAll(); 
if(list != null) 
{ 
    //do something --- in here even if the result set has no values it will 
    // go to this line. It just say `enumeration yielded no results` 
} 

Cualquier posible manera de comprobar los resultados se han contenido o no ??

Gracias

Respuesta

62

list nunca será null con LINQ; simplemente representará una "colección vacía" si es necesario. La forma de prueba es el método Any extensión:

if (list.Any()) { 
    // list has at least one item 
} 
+0

bastante simple. Gracias –

+0

Pero sin ToList() esto podría ser muy costoso. –

+3

@HenkHolterman: ¿Por qué? Apuesto a que en este ejemplo en particular, 'Any()' daría como resultado 'SELECT COUNT (*) ...' y una comparación entera. Incluso si sigue la ruta tonta de comenzar a enumerar un conjunto de resultados, ¿cómo sería 'ToList' más rápido? – Jon

1

Una excepción se produce si IQueryable yeilds ningún resultado. Yo uso:

using System.Data.Entity; //for Async support in EF 
var tQ = await _tableRepository.DisplayAll(); 
try { return await tQ.ToListAsync(); } 
catch { return null; } 

para atrapar la excepción y devolver nulo; o una lista vacía si lo prefiere,

catch { return new List<Table>(); } 
-2

Aquí es lo que funciona para mí:

public IQueryable SomeFunc() 
    { 
     IQueryable result = Repo.SomeLinqQuery(); 
     if (result.GetEnumerator().MoveNext() == false) 
     { 
      throw new Exception("Results empty"); 
     } 
     return result; 
    } 
+1

¿por qué realmente necesita hacer esto? –

+1

masturbación cerebral;) Es fascinante hasta qué punto se puede complejizar una cuestión simple. – Jerther

+1

Esta parte es buena: result.GetEnumerator(). MoveNext() == false – cfnerd

Cuestiones relacionadas