我对异常有疑问。
我的客户说有时出现此错误消息:
序列不包含匹配元素。
但是当我从电脑上检查时,它没有任何问题。它有时发生在我的客户端。 在我检查了日志后,它说问题出在这行代码中:
var firstRc = entity.Right.Components.First(r => r.CadastralObjectId == parentCadastralObjectId
&& r.ValidityEndCaseId == null
&& r.IsLive == false);
我应该尝试使用FirstOrDefault
而不只是First
吗?
答案 0 :(得分:2)
方法First
会抛出InvalidOperationException
。
如果给定的序列为空,则方法FirstOrDefault
返回default(T)
。
答案 1 :(得分:1)
First()
将抛出异常。所以使用FirstOrDefault()
,如果没有匹配则返回元素类型的默认值(对于引用类型为null)物品被发现
更改为
var firstRc = entity.Right.Components.FirstOrDefault(r => r.CadastralObjectId == parentCadastralObjectId
&& r.ValidityEndCaseId == null
&& r.IsLive == false);
答案 2 :(得分:1)
您是否应该使用First
或FirstOrDefault
取决于您是否认为应始终返回某些内容。
如果应该总是有东西然后使用First并且抛出异常是正确的。这是一个错误,没有任何内容,First
将抛出一个正是你想要的异常。
如果预计有时会出现匹配,请使用FirstOrDefault
,然后根据需要处理默认值(可能为空)。
哪种方式最适合您的应用程序,只有您可以回答。
答案 3 :(得分:0)
你应该更喜欢FirstOrDefault而不是First。 因为首先必须找到至少一个元素。
答案 4 :(得分:0)
仅当查询始终匹配至少一个元素且仅需要匹配组的第一个元素时,才使用First
方法。如果序列为空,则该方法将抛出InvalidOperationException
。
如果您希望查询总是与完全匹配一个元素,那么请使用Single
方法。如果序列为空,或者序列包含多个元素,它将抛出InvalidOperationException
。
但是,如果预计有时查询可能不匹配任何元素,那么您应该使用FirstOrDefault
或SingleOrDefault
方法。如果序列为空,它们都将返回默认值。这意味着在引用类型的情况下,返回值将为null
,因此您应该为null
添加一些额外的检查。另外,请注意,如果序列包含多个元素,SingleOrDefault
仍会抛出。