2011-01-11 16 views
5

Estoy en la necesidad de determinar si un método IQueryable regresa con datos, o "vacío" cuando se aplica a un origen de datos de un RadGrid así:¿Qué devuelve un IQueryable vacío como cuando está vacío?

RadGrid.DataSource = Method(x); 

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

He intentado usar "nulo" en lugar de la "yyy" pero sin éxito. Al recorrer el código, el Método IQueryable regresa como "Vacío", pero no estoy seguro de cómo verificarlo con una instrucción If.

¿Qué devuelve un Método IQueryable como si lo devuelve como Vacío, y cómo puedo verificarlo con una instrucción If?

Respuesta

12

Se puede utilizar cualquier() para comprobar para ver si hay elementos en el IQueryable:

RadGrid.DataSource = Method(x); 

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

(O, alternativamente, la versión más corta :)

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

¿Hay referencias adicionales que necesitaré usar. Any()? Como estoy recibiendo errores al tratar de compilar esto. – Lando

+1

@Lando: normalmente, si ya usa IQueryable, debería "funcionar", es un método de extensión en Queryable.Any (http://msdn.microsoft.com/en-us/library/bb534338.aspx) - Asegúrese de tener 'using System.Linq;' en la parte superior de su archivo, así como una referencia a System.Core.dll. –

+0

Esto es lo que había pensado también. Como utilizo LINQ en casi todas mis páginas actuales, System.Linq; la referencia ya existe en la parte superior de la página. Estoy accediendo a mis métodos a través de un archivo .dll por separado que he creado ... que no debería hacer ninguna diferencia, ¿o sí? – Lando

-2

Prueba esto:

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

Desde Enumerable.Empty<TResult>() se almacena en caché para TResult que llevará a cabo la misma referencia que la secuencia vacía reterned de Method y por lo tanto será equatable.

Si no está seguro de si es o no va a funcionar, vuelva a ejecutar este ejemplo:

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

Creo que eso es una referencia comparación y así falla, en general. – jason

+0

-1 Esto realizará una comparación de referencia. Debería ser obvio por qué esto no funcionará en casi todos los casos. Solo * funcionará * si el método devuelve 'Enumerable.Empty ()' - y en la mayoría de los casos devolverá algún otro enumerable que no tenga elementos. – cdhowie

+0

Aquí está mi contraejemplo: 'public static IEnumerable Empty () {yield break; } public static bool Test() {return Vacío () == Enumerable.Empty (); } ' 'Test()' devolverá falso, como debería. Esto solo funcionará si el método al que se llama devuelve 'Enumerable.Empty ()' - no todos los enumerables vacíos son equivalentes. Usando 'Enumerable.Any ()' es un enfoque mucho mejor. – cdhowie

5

que desea utilizar IQueryable.Any.

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

Pruebe algo como

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