web-dev-qa-db-ja.com

「シーケンスに要素が含まれていません」というエラーが発生するのはなぜですか?

無効な操作の例外が発生しました。スタックは下にあります。 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}] 
17
schumacherj

再び確かめる。必要に応じてデバッガーを使用します。私の推測では、userResponseDetailsの一部のアイテムについて、このクエリは要素を検出しません。

.Where(y => y.ResponseId.Equals(item.ResponseId))

だから電話できない

.First()

その上。たぶん試してみて

.FirstOrDefault()

問題が解決した場合。

NULL値を返さないでください!これは純粋に、問題の場所を確認して診断できるようにするためです。これらのケースを適切に処理してください。

37
KadekM

これが問題のある行である場合:

_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です。

6
Grant

次の行。

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

Firstを呼び出していますが、db.Responses.Whereから返されたコレクションは空です。

0
Gary