为什么这个错误,’序列不包含任何元素’,正在发生?
我收到一个无效的操作exception,堆栈在下面。 我认为这是因为db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();
没有返回任何结果。 我检查了响应数据,userResponseDetails有一个ResponseId,我也只使用了硬编码值。 我也知道调用这个的语句是添加此函数应该调用的Responses行。 (这个工作大约一个月前,我不记得改变什么会打破这个)
[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 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', })
经过严格审查后,这是一个很好的事情:
[{"ResponseId":118,"ResponseDetailVal":0.36,"QuestioChoicesId":null}]
再检查一遍。 如果必须,请使用调试器。 我的猜测是,对于userResponseDetails中的某个项,此查询找不到任何元素:
.Where(y => y.ResponseId.Equals(item.ResponseId))
所以你不能打电话
.First()
在上面。 也许试试吧
.FirstOrDefault()
如果它解决了这个问题。
不要返回NULL值! 这纯粹是为了让您可以查看和诊断问题所在。 妥善处理这些案件。
如果这是违规行:
db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();
然后是因为ResponseId == item.ResponseId
的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
。
在以下行中。
temp.Response = db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();
您正在调用First但从db.Responses.Where返回的集合为空。