2011-10-19 113 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

相关问题