我对LINQ查询有疑问。通常,查询返回IEnumerable<T>类型。如果返回为空,则不确定它是否为空。我不确定以下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。

评论

我猜结果是Enumerable.Empty?

#1 楼

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

#2 楼

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

if (!YourResult.Any())


请注意,.Any仍将从数据库中检索记录;进行一次.FirstOrDefault()/.Where()的开销会一样多,但是您将能够捕获查询返回的对象

评论


问题在哪里提到数据库?

–cja
13年11月14日10:00

您必须问编辑的那个,我没有提到任何数据库:)

– Noich
2014年7月6日下午5:37

点编辑器正在制作声音,但是,无论是否为DB。我相信他们说.Any()只会告诉您是否有任何匹配的记录,而当.Any()没有时,在其中进行实际查询以查找特定值的查询可能为null。

–vapcguy
2014年12月18日下午3:45

该编辑实际上可能是错误的。如果对实体使用linq,则数据库可能会对此进行快捷操作,并且除了true或false之外,没有任何数据发送到客户端。

–Mafii
16年8月15日在13:28

#3 楼

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
16年1月8日在6:53

TIL Count()也是一种方法,而不仅仅是属性

–heyNow
16年8月18日在14:13

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

– SHEePYTaGGeRNeP
17年7月22日在8:27

#4 楼

.ToList返回一个空列表。 (与新的List()相同);

#5 楼

在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;)

评论


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

–李凯
17年6月16日在1:23

这会回答问题吗?

–首领铅笔
19-10-29在15:01

#6 楼

这里的其他帖子清楚地表明结果是一个“空” IQueryable,它会将ToList()正确更改为一个空列表等。

请谨慎使用某些运算符,因为它们如果您向他们发送一个空的枚举,将抛出该异常。将它们链接在一起时,可能会发生这种情况。

评论


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

– Trevorc
2011年11月30日在21:11

#7 楼

它不会引发异常,您会得到一个空列表。