我有一个LINQ查询,它应返回单个结果或不返回结果。我打电话给Single()
得到如下结果:
var propertyDataSource = (from x in myCollection
where SomeCondition(x)
select x).Single();
当我的查询只有一个结果时,这可以正常工作,但是如果没有结果,它会抛出System.InvalidOperationException
消息序列不包含任何元素。
我该如何解决这个问题?
答案 0 :(得分:27)
改为使用SingleOrDefault
。
Single
抛出异常,SingleOrDefault<T>
在空枚举上调用时返回default(T)
(对于引用类型为null
) 。请注意,如果枚举中有多个元素,则两者都将抛出。
答案 1 :(得分:7)
.SingleOrDefault()
将返回单个匹配对象或默认值(对于引用类型为null
。您必须自己处理null
案例,因为您最终会很快就有了NullReferenceException
。
作为旁注,您应该使用.Any()
而不是.Count() > 0
来避免在使用IEnumerable
时迭代整个数据集。
答案 2 :(得分:5)
按照设计,Single
将在序列为空时抛出异常。当序列为空时,使用SingleOrDefault
返回null
。
答案 3 :(得分:5)
.FirstOrDefault()
如果不存在则返回null(或类型的默认值)(未找到匹配项),.Single()
将完全匹配一个匹配项。如果没有任何内容,.SingleOrDefault()
将返回null(或类型的默认值),但如果您有多个匹配项,则会抛出异常。