2011-11-27 80 views
12

雖然下面的LINQ的執行,我得到這個異常:LINQ:異常的 「序列不包含任何元素」

「序列不包含任何元素」

的Linq代碼:

newGradeRow[rowCnt + 1 + "Grade " + ExamName] = 
     objDataSet.Tables[1].Rows.Cast<DataRow>() 
     .Where(p => Convert.ToDecimal(p["EMG_MARKS_ABOVE"]) <= extSubMarks 
     && extSubMarks <= Convert.ToDecimal(p["EMG_MARKS_BELOW"])) 
     .Select(p => Convert.ToString(p["EMG_GRADE_NAME"])) 
     .First(); 

任何人都可以幫助我嗎?

+3

異常很明顯 - 您正在使用的列表中的一個爲空,並且沒有返回任何結果。 – Oded

+2

正如我在執行中提到的問題,我得到一個異常爲「序列不包含任何元素」。你能告訴我爲什麼我得到這個異常或代碼中有什麼錯誤。我是.net的新手。 –

+2

我認爲你的收藏沒有物品。 *你認爲你應該做什麼?這個問題是一個基本思想的練習。 – Amy

回答

0

objDataSet.Tables[1]是空的嗎?

也許數據是在objDataSet.Tables[0]

無論哪種方式,你可以用objDataSet.Tables.Count() > 0

測試可以爲行做同樣的:objDataSet.Tables[1].Rows.Count() > 0

+2

或者沒有元素通過'Where'過濾器。當它被給出一個空列表時,'First'會引發異常。 –

+0

哦,是的。謝謝。 –

39

拋出異常的First方法調用,如果因爲它是在documentation規定的序列爲空。在這種情況下,最好使用FirstOrDefault方法 - 它將返回默認值(在特定情況下爲null),並且不會拋出異常。

1

您應該注意這一點: 什麼Linq表達式/查詢不包含任何記錄,那麼你不能使用Single()First()

On the place Single() in your Lambda expression use FirstOrDefault() 
2

很難說,如果在同一行代碼中串聯了很多這樣的序列,那麼WHICH序列沒有元素。嘗試將代碼分解爲多行,然後進行調試。這也會使它更具可讀性。

var myVariable = objDataSet.Tables[1]; 
var myEntity = myVariable.Rows.Cast<DataRow>().Where(
    p => Convert.ToDecimal(p["EMG_MARKS_ABOVE"]) <= extSubMarks 
    && extSubMarks <= Convert.ToDecimal(p["EMG_MARKS_BELOW"])) 
    .Select(p => Convert.ToString(p["EMG_GRADE_NAME"])).FirstOrDefault(); 

如果問題出在你的Lambda表達式的地方,你可能會想打破它變成一個foreach循環(只用於調試有VS立即窗口中訪問數據&的緣故)。

+1

你已經改變了最後一次調用'FirstOrDefault()'這將擺脫異常,但你沒有提到那有點奇怪。 –

+0

我的錯誤。我更喜歡使用First()的FirstOrDefault()擴展方法來獲得更好的異常處理。之後您可以在繼續之前檢查是否有空位。 –

6

從分手開始。您當前的代碼不提供調試器。

var r1 = objDataSet.Tables[1].Rows; 
var r2 = r1.Cast<DataRow>(); 
System.Diagnostics.Debug.Print("r2: {0}", r2.Count()); 
var r3 = r2.Where(p => Convert.ToDecimal(p["EMG_MARKS_ABOVE"]) <= extSubMarks 
      && extSubMarks <= Convert.ToDecimal(p["EMG_MARKS_BELOW"])); 
System.Diagnostics.Debug.Print("r3: {0}", r3.Count()); 
var r4 = r3.Select(p => Convert.ToString(p["EMG_GRADE_NAME"])); 
var r5 = r4.First(); 

newGradeRow[rowCnt + 1 + "Grade " + ExamName] = r5; 
+0

儘管代碼有點煩瑣,但很明顯只有那些會拋出異常的東西是對First()的調用,它需要一個或多個元素。 –

+0

@BenRobinson,同意,但是在Where()之前或之後它是空的嗎?我想知道。 –

+3

夠公平的,但我建議你提到它是調用'First()'拋出並解釋'First()'和'FirstOrDefault()' –

相關問題