無効な操作の例外が発生しました。スタックは下にあります。 db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();
が結果を返さないためだと思います。応答データを確認し、userResponseDetailsにResponseIdがあり、ハードコードされた値も使用しました。また、これを呼び出すステートメントが、この関数が呼び出す必要があるResponses行を追加していることも知っています。 (これは約1か月前に機能していましたが、これを壊すような変更は一切覚えていません)
[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',
})
そして、これは厳格化された後のrdetailです:
[{"ResponseId":118,"ResponseDetailVal":0.36,"QuestioChoicesId":null}]
再び確かめる。必要に応じてデバッガーを使用します。私の推測では、userResponseDetailsの一部のアイテムについて、このクエリは要素を検出しません。
.Where(y => y.ResponseId.Equals(item.ResponseId))
だから電話できない
.First()
その上。たぶん試してみて
.FirstOrDefault()
問題が解決した場合。
NULL値を返さないでください!これは純粋に、問題の場所を確認して診断できるようにするためです。これらのケースを適切に処理してください。
これが問題のある行である場合:
_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
です。
次の行。
temp.Response = db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First();
Firstを呼び出していますが、db.Responses.Whereから返されたコレクションは空です。