2015-07-10 36 views
1

我對異常有疑問。序列號不匹配元素

我的客戶說,有時,它出現此錯誤消息:

序列中沒有匹配的元素。

但是,當我從我的電腦檢查它沒有任何問題。它只是偶爾發生在我的客戶身上。 後我檢查它說,這個問題是在這行代碼日誌:

var firstRc = entity.Right.Components.First(r => r.CadastralObjectId == parentCadastralObjectId 
           && r.ValidityEndCaseId == null 
           && r.IsLive == false); 

我應該嘗試使用FirstOrDefault而不只是First

+1

是的,使用'FirstOrDefault'。 –

+0

總是建議使用FirstOrDefault,因爲如果它不匹配任何內容,它不會引發錯誤。 – ckruczek

+0

@ user2568960使用'FirstOrDeafault()' - MSDN _says_ **返回序列的第一個元素,或者如果序列不包含元素,則返回默認值** –

回答

1

First()將拋出一個異常,如果它不能找到任何匹配elements.so使用FirstOrDefault(),它返回的元素類型的默認值(這是空引用類型),如果未找到匹配項目

改爲

var firstRc = entity.Right.Components.FirstOrDefault(r => r.CadastralObjectId == parentCadastralObjectId 
                && r.ValidityEndCaseId == null 
                && r.IsLive == false); 
+1

說你應該使用'FirstOrDefault'並不是真的正確。 「First」的存在是有原因的,不僅因爲它們在寫FirstOrDefault時沒有刪除它。有時候,如果缺少一個項目確實是一個錯誤,那麼你想使用'First'。 – Chris

0

你應該更喜歡FirstOrDefault而不是First。首先必須至少找到一個元素。

+0

'第一個'不必只找到一個元素。這是你正在考慮的「Single」。如果期望是總是至少有一個元素,如果不是,那麼'First'在這裏完全適用。使用FirstOrDefault只會將錯誤從其實際來源進一步移動。 – Chris

+0

首先返回序列的第一個元素,右邊。當序列爲空時拋出InvalidOperationException。 FirstOrDefault返回默認值。 - 爲參考類型。 –

1

是否應該使用FirstFirstOrDefault取決於您是否認爲應該始終返回某些內容。

如果應該總是有東西,那麼使用First並拋出異常是正確的。這是一個錯誤,那裏沒有任何東西,First將拋出一個異常,這正是你想要的。

如果預計有時不會匹配,則使用FirstOrDefault,然後根據需要處理默認值(可能爲null)。

哪一個最適合您的應用程序是您只能回答的問題。

0

只有當查詢應該總是匹配至少一個元素並且只需要匹配組的第一個元素時,才使用First方法。如果序列爲空,該方法將拋出InvalidOperationException

如果你希望查詢到總是比賽只有一個元素,然後使用Single方法。如果序列爲空,或者序列包含多個元素,它將拋出InvalidOperationException

但是,如果預計有時查詢可能不匹配任何元素,那麼您應該使用FirstOrDefaultSingleOrDefault方法。如果序列爲空,它們都會返回默認值。這意味着如果是參考類型,返回值將是null,所以您應該添加一些額外的檢查null。另外,如果序列包含多個元素,請注意SingleOrDefault仍然會拋出。