为什么这个错误,’序列不包含任何元素’,正在发生?

我收到一个无效的操作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.ResponseIdResponseId == 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返回的集合为空。