2011-01-11 17 views
5

Jestem w potrzebie ustalenia, czy metoda IQueryable powraca z danymi, lub „Empty” przy stosowaniu go do źródła danych o RadGrid tak:Co zwraca pusty produkt IQueryable, gdy jest pusty?

RadGrid.DataSource = Method(x); 

     if (Method(x) == yyy) 
     { 
      button.Enabled = true; 
     } 
     else 
     { 
      button.Enabled = false; 
     } 

Próbowałem, używając „null” w miejsce "yyy", ale bez powodzenia. Podczas przechodzenia przez kod metoda IQueryable zwraca wartość "Empty", ale nie jestem pewien, w jaki sposób zweryfikować to za pomocą instrukcji If.

Co zwraca metoda IQueryable, która zwraca wartość Empty, i jak mogę zweryfikować, używając instrukcji If?

Odpowiedz

12

można użyć dowolnego(), aby sprawdzić, czy są jakieś elementy w IQueryable:

RadGrid.DataSource = Method(x); 

if (Method(x).Any()) 
{ 
    button.Enabled = true; 
} 
else 
{ 
    button.Enabled = false; 
} 

(albo, alternatywnie, krótsza wersja :)

button.Enabled = Method(x).Any(); 
+0

Czy są jakieś dodatkowe odwołania, których będę musiał użyć. Any()? Ponieważ dostaję błędy podczas próby skompilowania tego. – Lando

+1

@Lando: Zazwyczaj, jeśli już korzystasz z IQueryable, powinien on "po prostu działać" - jest to metoda rozszerzenia dla Queryable.Any (http://msdn.microsoft.com/en-us/library/bb534338.aspx) - Upewnij się, że w górnej części pliku znajduje się 'using System.Linq;', a także odniesienie do pliku System.Core.dll. –

+0

To też wymyśliłem. Ponieważ używam LINQ na prawie wszystkich moich bieżących stronach, System.Linq; odniesienie już istnieje u góry strony. Uzyskuję dostęp do moich metod przez osobny plik .dll, który wcześniej utworzyłem ... to nie powinno powodować żadnych różnic? – Lando

-2

Spróbuj tego:

if (Method(x) == Enumerable.Empty<YourType>()) 
{ 
    // Your code 
} 

Od Enumerable.Empty<TResult>() są buforowane dla TResult będzie posiadać taką samą nazwę jak pustym sekwencji reterned z Method i dlatego będzie equatable.

Jeśli nie jesteś pewien, czy to zadziała, należy uruchomić ten przykład:

using System; 
using System.Linq; 

class Example 
{ 
    static void Main() 
    { 
     var first = Enumerable.Empty<Example>(); 
     var second = Enumerable.Empty<Example>(); 

     Console.WriteLine(object.ReferenceEquals(first, second)); 
    } 
} 
+0

Myślę, że to referencja porównanie i tak się nie udaje. – jason

+0

-1 Spowoduje to porównanie odniesienia. Powinno być oczywiste, dlaczego to nie zadziała w prawie każdym przypadku. Będzie działać * tylko *, jeśli metoda zwróci wartość 'Enumerable.Empty ()' - iw większości przypadków zwróci ona kilka innych zmiennych, które nie zawierają elementów. – cdhowie

+0

Oto mój kontrprzykład: "public static IEnumerable Empty () {yield break; } public static bool Test() {return Empty () == Enumerable.Empty (); } '. 'Test()' zwróci false, tak jak powinien. To zadziała tylko wtedy, gdy wywoływana metoda zwraca 'Enumerable.Empty ()' - nie wszystkie puste wyliczenia są równoważne. Używanie 'Enumerable.Any ()' jest znacznie lepszym podejściem. – cdhowie

0

Wypróbuj coś takiego:

RadGrid.DataSource = Method(x);    
if (RadGrid.DataSource as MyObject == null)   
{    
     button.Enabled = true;   
}   
else   
{    
     button.Enabled = false;   
}