2011-01-11 14 views
5

Ho bisogno di determinare se un metodo IQueryable ritorna con dati, o "vuoto" quando si applica ad un DataSource di un RadGrid in questo modo:Cosa restituisce un IQueryable vuoto come quando vuoto?

RadGrid.DataSource = Method(x); 

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

Ho provato con "null" al posto del "yyy" ma senza successo. Quando si passa attraverso il codice, il metodo IQueryable restituisce come "vuoto", ma non sono sicuro di come verificare l'utilizzo di un'istruzione If.

Cosa restituisce un metodo IQueryable come se restituisce come Vuoto e come posso verificare che si utilizza un'istruzione If?

risposta

12

è possibile utilizzare qualsiasi() per controllare per vedere se ci sono elementi nella IQueryable:

RadGrid.DataSource = Method(x); 

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

(O, in alternativa, la versione più breve :)

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

Ci sono riferimenti extra che dovrò usare. Any()? Come sto ricevendo errori durante il tentativo di compilare questo. – Lando

+1

@Lando: in genere, se si utilizza già IQueryable, dovrebbe "funzionare" semplicemente - è un metodo di estensione su Queryable.Any (http://msdn.microsoft.com/en-us/library/bb534338.aspx) - Assicurati di avere 'using System.Linq;' nella parte superiore del tuo file, oltre a un riferimento a System.Core.dll. –

+0

Questo è quello che avevo immaginato anche io. Poiché utilizzo LINQ su quasi tutte le mie pagine correnti, System.Linq; riferimento esiste già nella parte superiore della pagina. Sto accedendo ai miei metodi attraverso un file .dll separato che ho creato in precedenza ... che non dovrebbe fare alcuna differenza, dovrebbe? – Lando

-2

Prova questo:

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

Da Enumerable.Empty<TResult>() viene memorizzato nella cache per TResult terrà lo stesso riferimento la sequenza vuota reterned da Method e pertanto sarà equatable.

Se non siete sicuri se questo funziona, si prega di eseguire questo esempio:

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

Penso che sia un riferimento confronto e così fallisce, in generale. – jason

+0

-1 Effettuerà un confronto di riferimento. Dovrebbe essere ovvio perché questo non funzionerà in quasi tutti i casi. * Funzionerà * solo se il metodo restituisce 'Enumerable.Empty ()' - e nella maggior parte dei casi restituirà altri enumerabili che non hanno elementi. – cdhowie

+0

Ecco il mio contro-esempio: 'public static IEnumerable Empty () {yield break; } public static bool Test() {return Empty () == Enumerable.Empty (); } '. 'Test()' restituirà false, come dovrebbe. Questo funzionerà solo se il metodo chiamato restituisce 'Enumerable.Empty ()' - non tutti gli enumerables vuoti sono equivalenti. Usare 'Enumerable.Any ()' è un approccio molto migliore. – cdhowie

5

che si desidera utilizzare IQueryable.Any.

bool empty = !queryable.Any(); 
if(empty) { 
    // something 
} 
0

Prova qualcosa come

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