C# 为什么会出现这种错误';序列不包含元素';,发生

C# 为什么会出现这种错误';序列不包含元素';,发生,c#,asp.net-mvc-3,linq,C#,Asp.net Mvc 3,Linq,我得到一个无效的操作异常,堆栈在下面。我认为这是因为db.Responses.Where(y=>y.ResponseId.Equals(item.ResponseId)).First()未返回任何结果。我检查了响应数据,userResponseDetails有一个ResponseId,我还使用了一个硬编码的值。我还知道调用这个函数的语句正在添加这个函数应该调用的Responses行。(这大约在一个月前起作用,我不记得改变了什么会破坏这一点) 这是违规代码 [HttpPost] p

我得到一个无效的操作异常,堆栈在下面。我认为这是因为
db.Responses.Where(y=>y.ResponseId.Equals(item.ResponseId)).First()未返回任何结果。我检查了响应数据,userResponseDetails有一个ResponseId,我还使用了一个硬编码的值。我还知道调用这个函数的语句正在添加这个函数应该调用的Responses行。(这大约在一个月前起作用,我不记得改变了什么会破坏这一点)

这是违规代码

    [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);
    }
这是一条在被划破后的尾巴:

[{"ResponseId":118,"ResponseDetailVal":0.36,"QuestioChoicesId":null}] 
在下面一行

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

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

请再次检查。必要时使用调试器。我的猜测是,对于userResponseDetails中的某些项,此查询未找到任何元素:

.Where(y => y.ResponseId.Equals(item.ResponseId))
所以你不能打电话

.First()
在上面。也许试试

.FirstOrDefault()
如果它解决了问题


不要返回空值!这纯粹是为了让您能够看到并诊断问题所在。妥善处理这些案件。

如果这是违规行为:

db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();
这是因为
responsed
中没有对象的
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

,这有助于确定真正的问题。由于我的模型中有输入错误,传入的值映射不正确。不同意。FIrstOrDefault将删除该错误,而不是问题。返回null可能不是OP想要的。检查为什么您最终可能会有0条记录并采取行动accordingly@GianlucaGhettini完全同意。这不是一个合适的解决方案,但“作为一个测试”旨在帮助识别问题,而fining real solution取决于OPS。如果您不关心它是否不存在,例如解析xml文件,其中并不总是有元素,那么这就是正确的解决方案
db.Responses.Where(y => y.ResponseId.Equals(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;