Почему эта ошибка, "Последовательность не содержит элементов", происходит?
Я получаю 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.