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;