2011-10-19 11 views
28

Chcę tylko wiedzieć, jaki jest najlepszy sposób sprawdzenia, czy wynik IQueryable nie ma wartości.Jaki jest najlepszy sposób sprawdzenia zestawu wyników IQueryable jest pusty?

np. jeśli mamy metodę jak

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

a potem zrobić coś takiego

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` 
} 

jakikolwiek sposób sprawdzić zestaw zawiera treści lub nie wynik ??

Dzięki

Odpowiedz

62

list nigdy nie będzie null z LINQ; po prostu będzie to "pusty zbiór", jeśli zajdzie taka potrzeba. Droga do testu jest metodą Any rozszerzenia:

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

dość prosta. Dziękuję –

+0

Ale bez ToList() może to być bardzo kosztowne. –

+3

@HenkHolterman: Dlaczego? Założę się o dobre pieniądze, że w tym konkretnym przykładzie 'Any()' spowodowałoby 'SELECT COUNT (*) ...' i porównanie liczb całkowitych. Nawet jeśli pójdzie na głupią drogę, zaczynając wyliczać zestaw wyników, w jaki sposób "ToList" będzie szybszy? – Jon

1

Wyjątek zostanie wyrzucony jeśli IQueryable yeilds żadnego rezultatu. Używam:

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

pułapki wyjątek i zwraca wartość null; lub pustą listę, jeśli wolisz,

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

Oto, co działa dla mnie:

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

dlaczego tak naprawdę musisz to zrobić? –

+1

masturbacja mózgu;) To fascynujące, jak daleko można skomplikować prostą sprawę. – Jerther

+1

Ta część jest dobra: result.GetEnumerator(). MoveNext() == false – cfnerd

Powiązane problemy