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

sch*_*erj 19 c# linq asp.net-mvc-3

我收到一个无效的操作异常,堆栈在下面.我认为这是因为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
Run Code Online (Sandbox Code Playgroud)

这是违规代码.

    [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);
    }
Run Code Online (Sandbox Code Playgroud)

这是调用此特定操作的AJAX:

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

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

[{"ResponseId":118,"ResponseDetailVal":0.36,"QuestioChoicesId":null}] 
Run Code Online (Sandbox Code Playgroud)

Kad*_*ekM 39

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

.Where(y => y.ResponseId.Equals(item.ResponseId))
Run Code Online (Sandbox Code Playgroud)

所以你不能打电话

.First()
Run Code Online (Sandbox Code Playgroud)

在上面.也许试试吧

.FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)

如果它解决了这个问题.

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

  • 不同意.FIrstOrDefault将*删除*该错误,而不是问题.返回null可能不是OP想要的.检查为什么你最终得到0记录并采取相应行动 (2认同)

Gra*_*ICA 8

如果这是违规行:

db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();
Run Code Online (Sandbox Code Playgroud)

然后,它是因为在没有对象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;
Run Code Online (Sandbox Code Playgroud)

FirstOrDefault()如果未找到匹配项,扩展将返回对象的默认值.对于大多数对象(基本类型除外),这是null.