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();
Может ли кто-нибудь помочь мне в этом?
Ответы
Ответ 1
Исключение возникает в вызове метода First
, если последовательность пуста, как указано в документации. В этом случае лучше использовать метод FirstOrDefault - он вернет значение по умолчанию (в конкретном случае null
), и никакое исключение не будет выбрано.
Ответ 2
Начните с разрыва. Ваш текущий код не позволяет захватить отладчик.
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;
Ответ 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).
Ответ 4
Вам следует позаботиться о том, чтобы:
Что Linq Expression/query не содержит записи, тогда вы не можете использовать Single()
и First()
.
On the place Single() in your Lambda expression use FirstOrDefault()
Ответ 5
objDataSet.Tables[1]
пусто?
Возможно, данные находятся в objDataSet.Tables[0]
?
В любом случае, вы можете протестировать с помощью objDataSet.Tables.Count() > 0
Вы можете сделать то же самое для строк: objDataSet.Tables[1].Rows.Count() > 0