结果为空时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)
【讨论】:
没错!您可以更好地了解调查结果 TILCount()
也是一种方法,而不仅仅是属性
你不应该使用 .Any() 因为 count 将枚举所有项目吗?【参考方案4】:
.ToList 返回一个空列表。 (与new List<T>()
相同);
【讨论】:
【参考方案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】:此处的其他帖子已明确表明结果是“空”IQueryable
,ToList()
将正确更改为空列表等。
请注意某些运算符,因为如果您向它们发送一个空的可枚举,它们会抛出异常。将它们链接在一起时可能会发生这种情况。
【讨论】:
"对一些运算符要小心,因为如果你给他们一个空的枚举,他们会抛出。当你把它们链接在一起时会发生这种情况。" ——这就是我的收获。我有一个空返回值,然后我将其输入另一个查询。这导致第二个查询抛出,无论我将它转换成什么,因为没有值被输入到第二个查询中。以上是关于结果为空时LINQ返回啥的主要内容,如果未能解决你的问题,请参考以下文章