Подтвердить что ты не робот

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();

Может ли кто-нибудь помочь мне в этом?

4b9b3361

Ответ 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