在执行以下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();
有人能帮我吗?
发布于 2011-11-27 13:02:54
如果序列是空的,则异常将在First
方法调用中抛出,正如documentation中所述。在这种情况下,最好使用FirstOrDefault方法-它将返回默认值(在特定情况下是null
),并且不会抛出任何异常。
发布于 2011-11-27 13:15:00
从分手开始。当前代码没有为调试器提供抓地力。
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;
发布于 2011-11-27 13:11:19
当在同一代码行中有这么多串在一起时,很难说哪个序列没有元素。尝试将代码分解为多行,然后调试它。这也将使它更具可读性。
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的直接窗口中的数据)。
https://stackoverflow.com/questions/8285627
复制相似问题