2011-10-19 111 views
28

我只想知道檢查IQueryable結果是否沒有值的最佳方法是什麼。什麼是檢查IQueryable結果集的最佳方法是空

例如。如果我們有像

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

的方法,然後我們做這樣的事情

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

任何可能的方式來檢查結果集的內容或不?

感謝

回答

62

list將永遠null與LINQ;如果需要的話,它只會代表一個「空集」。測試的方法是用Any擴展方法:如果IQueryable的yeilds沒有結果

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

簡單。謝謝 –

+0

但是如果沒有ToList(),這可能會非常昂貴。 –

+3

@HenkHolterman:爲什麼?我敢打賭,在這個特定的例子中,Any()會產生一個「SELECT COUNT(*)...」和一個整數比較。即使它開始枚舉結果集的愚蠢路線,'ToList'會如何更快? – Jon

1

一個異常將被拋出。我使用:

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

陷阱異常並返回null;或者如果你喜歡一個空的列表,

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

這裏對我來說是什麼工作:

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

爲什麼你真的需要這樣做? –

+1

大腦手淫;)有趣的是,人們可以將一件簡單的事情複雜化多遠。 – Jerther

+1

這部分雖然很好:result.GetEnumerator()。MoveNext()== false – cfnerd

相關問題