2011-01-11 14 views
5

Ich bin in der Notwendigkeit der Bestimmung, ob ein IQueryable-Methode mit Daten zurückgibt, oder „leer“, wenn es um eine Datasource eines RadGrid wie so anwenden:Was gibt ein leeres IQueryable zurück, wenn es leer ist?

RadGrid.DataSource = Method(x); 

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

I „null“ anstelle der Verwendung haben versucht, "yyy", aber ohne Erfolg. Beim Durchlaufen des Codes gibt die IQueryable-Methode als "Empty" zurück, aber ich bin mir nicht sicher, wie das mit einer If-Anweisung überprüft werden kann.

Was gibt eine IQueryable-Methode zurück, wenn sie als leer zurückgibt, und wie kann ich das mithilfe einer If-Anweisung überprüfen?

Antwort

12

können Sie einen beliebigen in der IQueryable alle Elemente sind, wenn es zu sehen() verwenden, um zu überprüfen:

RadGrid.DataSource = Method(x); 

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

(Oder alternativ die kürzere Version :)

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

Gibt es zusätzliche Referenzen, die ich verwenden muss? Wie bekomme ich Fehler beim Versuch, dies zu kompilieren. – Lando

+1

@Lando: In der Regel, wenn Sie bereits IQueryable verwenden, sollte es "nur funktionieren" - es ist eine Erweiterungsmethode auf Queryable.Any (http://msdn.microsoft.com/en-us/library/bb534338.aspx) - Stellen Sie sicher, dass Sie "using System.Linq;" am Anfang Ihrer Datei verwenden, sowie einen Verweis auf System.Core.dll. –

+0

Das habe ich mir auch gedacht. Da ich LINQ auf fast allen meinen aktuellen Seiten verwende, ist das System.Linq; Referenz existiert bereits oben auf der Seite. Ich greife auf meine Methoden über eine separate .dll zu, die ich zuvor erstellt habe ... das sollte keine Unterschiede machen, oder? – Lando

-2

Try this:

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

Da Enumerable.Empty<TResult>() für TResult zwischengespeichert wird es die gleiche Referenz wie die leere Sequenz von Method reterned halten und damit gleichzusetzen ist.

Wenn Sie nicht sicher sind, ob dies funktioniert, führen Sie bitte folgendes Beispiel:

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

Ich denke, das ist eine Referenz Vergleich und so versagt im Allgemeinen. – jason

+0

-1 Dies führt einen Referenzvergleich durch. Es sollte offensichtlich sein, warum dies nicht in jedem Fall funktionieren wird. Es wird * nur * funktionieren, wenn die Methode 'Enumerable.Empty ()' zurückgibt - und in den meisten Fällen wird ein anderes Enumerable zurückgegeben, das keine Elemente enthält. – cdhowie

+0

Hier ist mein Gegenbeispiel: 'public static IEnumerable Leer () {Ausbeute Pause; } public static bool Test() {return Leer () == Enumerable.Empty (); } '. 'Test()' gibt false zurück, wie es sein sollte. Dies funktioniert nur, wenn die aufgerufene Methode 'Enumerable.Empty ()' zurückgibt - nicht alle leeren Enumerables sind äquivalent. Die Verwendung von 'Enumerable.Any ()' ist ein viel besserer Ansatz. – cdhowie

5

Sie wollen IQueryable.Any verwenden.

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

Versuchen Sie etwas wie

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