结果为空时LINQ返回啥

Posted

技术标签:

【中文标题】结果为空时LINQ返回啥【英文标题】:What does LINQ return when the results are empty结果为空时LINQ返回什么 【发布时间】:2009-07-28 04:19:02 【问题描述】:

我有一个关于 LINQ 查询的问题。通常一个查询返回一个IEnumerable<T> 类型。如果返回为空,则不确定是否为空。如果在IEnumerable 结果中找不到任何内容,我不确定以下ToList() 是否会抛出异常或只是一个空的List<string>

   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】:

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

【讨论】:

仅供参考:你成功了 r/ProgrammerHumor ? 链接或者它没有发生:D 给你 :) reddit.com/r/ProgrammerHumor/comments/pv09ys/…【参考方案2】:

也可以查看.Any()方法:

if (!YourResult.Any())

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

【讨论】:

问题在哪里提到了数据库? 你得问编辑的人,我没有提到任何数据库:) 点编辑器是健全的,但是,DB 与否。我相信他们是在说.Any() 只是会告诉您是否有任何匹配的记录,在没有.Any() 的情况下,执行实际查询以查找特定值可能为空。 编辑可能实际上是错误的。如果对实体使用 linq,数据库可能会对此进行快捷操作,并且除了 true 或 false 之外,根本不会向客户端发送任何数据【参考方案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)

【讨论】:

没错!您可以更好地了解调查结果 TIL Count() 也是一种方法,而不仅仅是属性 你不应该使用 .Any() 因为 count 将枚举所有项目吗?【参考方案4】:

.ToList 返回一个空列表。 (与new List&lt;T&gt;() 相同);

【讨论】:

【参考方案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 ;)

【讨论】:

哦,你的解释有助于进一步理解。谢谢! 这能回答问题吗?【参考方案6】:

它不会抛出异常,你会得到一个空列表。

【讨论】:

在获取null的情况下抛出异常的正确方法是什么?我们是否必须在使用 if-else 语句查询后检查它? @SBU 你可以用 Any() 检查它并自己抛出异常: var result = source.Where(s=>s.Name == "SBU"); if(!result.Any()) throw new Exception("Result Is empty");【参考方案7】:

此处的其他帖子已明确表明结果是“空”IQueryableToList() 将正确更改为空列表等。

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

【讨论】:

"对一些运算符要小心,因为如果你给他们一个空的枚举,他们会抛出。当你把它们链接在一起时会发生这种情况。" ——这就是我的收获。我有一个空返回值,然后我将其输入另一个查询。这导致第二个查询抛出,无论我将它转换成什么,因为没有值被输入到第二个查询中。

以上是关于结果为空时LINQ返回啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在源集合为空时强制 LINQ Sum() 返回 0

mybatis中查询结果为空时不同返回类型对应返回值

mybatis查询结果为空时的返回值问题

当结果不为空时,num_rows() 未返回正确的行数

当过滤器为空时,它返回空数组

空时Linq查询不返回null