Почему эта ошибка, "Последовательность не содержит элементов", происходит?

Я получаю Invalid Operation Exception, стек ниже. Я думаю, это потому, что db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First(); не возвращает никаких результатов. Я проверил данные ответа, а userResponseDetails имеет ResponseId, я также просто использовал твердое кодированное значение. Я также знаю, что оператор, который вызывает этот, добавляет строку ответов, которую должна вызывать эта функция. (Это работало около месяца назад, и я не помню, чтобы что-то изменило, что нарушило бы это)

[InvalidOperationException: Sequence contains no elements]
   System.Linq.Enumerable.First(IEnumerable`1 source) +269
   System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__0(IEnumerable`1 sequence) +41
   System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +59
   System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +133
   System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +87
   System.Linq.Queryable.First(IQueryable`1 source) +251
   InSight.Controllers.ForecasterController.userResponseDetails(List`1 userResponseDetails) +1039

Вот код нарушения.

    [HttpPost]
    public JsonResult userResponseDetails(List<ResponseDetailsPartial> userResponseDetails)
    {

        foreach (ResponseDetailsPartial item in userResponseDetails)
        {
            ResponseDetails temp = new ResponseDetails();
            temp.ResponseId = item.ResponseId;
            temp.ResponseDetailVal = item.ResponseDetailVal;
            temp.QuestioChoicesId = item.QuestioChoicesId;
            temp.Response = db.Responses
                  .Where(y => y.ResponseId.Equals(item.ResponseId)).First();
            temp.QuestionChoice = db.QuestionChoices
                   .Where(x => x.QuestionChoicesId.Equals(item.QuestioChoicesId)).First();
          db.ResponseDetails.Add(temp);
        }
        db.SaveChanges();

        return Json(new { ResponseDetailsId = userResponseDetails }, JsonRequestBehavior.AllowGet);
    }

Это AJAX, который вызывает это конкретное действие:

$.ajax({
         type: "POST",
         url: '/Forecaster/userResponseDetails/',
         data: JSON.stringify(rdetail),
         dataType: 'json',
         contentType: 'application/json',
     })

и это будет rdetail после того, как он был зашифрован:

[{"ResponseId":118,"ResponseDetailVal":0.36,"QuestioChoicesId":null}] 

Ответ 1

Еще раз проверьте. Используйте debugger, если необходимо. Я предполагаю, что для некоторого элемента в userResponseDetails этот запрос не находит элементов:

.Where(y => y.ResponseId.Equals(item.ResponseId))

поэтому вы не можете позвонить

.First()

на нем. Возможно, попробуйте

.FirstOrDefault()

если он решает проблему.

НЕ возвращать значение NULL! Это чисто так, что вы можете видеть и диагностировать, где проблема. Правильно обрабатывайте эти случаи.

Ответ 2

Если это оскорбительная строка:

db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();

Тогда это потому, что в Responses нет объекта, для которого ResponseId == item.ResponseId, и вы не можете получить запись First(), если совпадений нет.

Попробуйте это вместо:

var response
  = db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).FirstOrDefault();

if (response != null)
{
    // take some alternative action
}
else
    temp.Response = response;

Расширение FirstOrDefault() возвращает значение по умолчанию для объектов, если совпадение не найдено. Для большинства объектов (кроме примитивных типов) это null.

Ответ 3

В следующей строке.

temp.Response = db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();

Вы вызываете First, но коллекция возвращается из db.Responses.Where empty.