当结果为空时,LINQ返回什么


319

我对LINQ查询有疑问。通常,查询返回一个IEnumerable<T>类型。如果返回为空,则不确定它是否为null。我不确定以下内容ToList()是否会引发异常,或者List<string>如果IEnumerable结果没有发现,则为空?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

我知道这是一个非常简单的问题,但是我暂时没有VS。


11
我猜结果是Enumerable.Empty?
David.Chu.ca,2009年

Answers:


512

它将返回一个空的可枚举。它不会为空。你可以睡觉的声音:)


38

您还可以检查.Any()方法:

if (!YourResult.Any())

只是一条注释.Any仍会从数据库中检索记录;这样做.FirstOrDefault()/.Where()将产生同样多的开销,但是您将能够捕获查询返回的对象


5
问题在哪里提到数据库?
2013年

4
您必须要问编辑的那个,我没有提到任何DB :)
Noich 2014年

点编辑器正在制作声音,但是,无论是否为DB。我相信他们说.Any()的只是告诉您是否有任何匹配的记录,在实际查询中查找特定值的情况可能为null,.Any()否则为空。
vapcguy 2014年

1
该编辑实际上可能是错误的。如果对实体使用linq,则数据库可能会对此进行捷径操作,并且除了真假外,其他任何数据都不会发送给客户端
Mafii

19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(转储来自LinqPad


究竟!您会更好地发现这些结果
netfed

TIL Count()也是一种方法,而不仅仅是财产
heyNow16年

2
您不应该使用.Any(),因为count将枚举所有项目吗?
SHEePYTaGGeRNeP


8

在Linq-to-SQL中,如果您尝试获取没有结果的查询的第一个元素,则会收到sequence contains no elements错误消息。我可以向您保证,上述错误不等于object reference not set to an instance of an object。结论不,它不会返回null,因为null不能说sequence contains no elements总是会说object reference not set to an instance of an object;)


1
哦,您的解释有助于进一步理解。谢谢 !
凯李

这会回答问题吗?
ChiefTwoPencils 19-10-29

7

此处的其他帖子清楚地表明结果是“空” IQueryable,ToList()会正确更改为空列表,等等。

请谨慎对待某些运算符,因为如果您将其发送为空的可枚举值,它们将抛出。将它们链接在一起时,可能会发生这种情况。


3
“请谨慎对待某些操作员,因为如果将它们发送给空枚举,它们将抛出。将它们链接在一起时,可能会发生这种情况。” -这就是我的意思。我有一个空值,然后将其输入另一个查询。不管我将其强制转换为什么,这都会导致第二个查询抛出,因为没有值被馈送到第二个查询中。
trevorc

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.