LINQ:异常为“序列不包含任何元素”

时间:2011-11-27 12:43:20

标签: c# .net 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();

任何人都可以帮我吗?

5 个答案:

答案 0 :(得分:47)

如果序列为空,则在First方法调用中抛出异常,如documentation中所述。在这种情况下,最好使用FirstOrDefault方法 - 它将返回默认值(在特定情况下为null),并且不会抛出任何异常。

答案 1 :(得分:7)

首先分解它。您当前的代码没有为调试器提供任何控制。

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;

答案 2 :(得分:3)

很难说当你在同一行代码中连接这么多时,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的即时窗口内的数据)。

答案 3 :(得分:1)

你应该注意这个: Linq表达式/查询不包含任何记录,因此您无法使用Single()First()

在Lambda表达式中的Single()位置使用FirstOrDefault()

答案 4 :(得分:0)

objDataSet.Tables[1]是空的吗?

也许数据在objDataSet.Tables[0]

无论哪种方式,您都可以使用objDataSet.Tables.Count() > 0

进行测试

您可以对行执行相同操作:objDataSet.Tables[1].Rows.Count() > 0