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值!这纯粹是为了让您可以查看和诊断问题所在.妥善处理这些案件.
如果这是违规行:
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.