2011-11-27 76 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()' –

相关问题