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

时间:2014-01-08 22:33:06

标签: c# asp.net-mvc-3 linq

我收到一个无效的操作异常,堆栈在下面。我认为这是因为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<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',
     })

在经过严格审查之后,这是最终的结果:

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

3 个答案:

答案 0 :(得分:35)

再次检查。如果必须,请使用调试器。我的猜测是,对于userResponseDetails中的某个项,此查询找不到任何元素:

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

所以你不能打电话

.First()

就可以了。也许试试

.FirstOrDefault()

如果它解决了这个问题。

不要返回NULL值!这纯粹是为了让您可以查看和诊断问题所在。妥善处理这些案件。

答案 1 :(得分:6)

如果这是违规行:

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

答案 2 :(得分:0)

在以下一行中。

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

您正在调用First但从db.Responses.Where返回的集合为空。