web-dev-qa-db-fra.com

Pourquoi cette erreur «La séquence ne contient aucun élément» se produit-elle?

Je reçois une exception d'opération non valide, la pile est en dessous. Je pense que c'est parce que db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).First(); ne renvoie aucun résultat. J'ai vérifié les données de réponse et le userResponseDetails a un ResponseId, j'ai aussi juste utilisé une valeur codée en dur. Je sais également que la déclaration qui appelle celle-ci ajoute la ligne Réponses que cette fonction devrait appeler. (Cela fonctionnait il y a environ un mois et je ne me souviens pas avoir changé quoi que ce soit qui pourrait casser cela)

[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

Voici le code incriminé.

    [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);
    }

C'est le AJAX qui appelle cette action spécifique:

$.ajax({
         type: "POST",
         url: '/Forecaster/userResponseDetails/',
         data: JSON.stringify(rdetail),
         dataType: 'json',
         contentType: 'application/json',
     })

et ceci est détaillé après avoir été strigifié:

[{"ResponseId":118,"ResponseDetailVal":0.36,"QuestioChoicesId":null}] 
17
schumacherj

Revérifier. Utilisez le débogueur si nécessaire. Je suppose que pour certains éléments de userResponseDetails, cette requête ne trouve aucun élément:

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

donc tu ne peux pas appeler

.First()

dessus. Peut-être essayer

.FirstOrDefault()

si cela résout le problème.

Ne retournez PAS de valeur NULL! C'est uniquement pour que vous puissiez voir et diagnostiquer où se trouve le problème. Manipulez ces valises correctement.

37
KadekM

S'il s'agit de la ligne incriminée:

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

Ensuite, c'est parce qu'il n'y a aucun objet dans Responses pour lequel le ResponseId == item.ResponseId, Et vous ne pouvez pas obtenir l'enregistrement First() s'il n'y a pas de correspondance.

Essayez plutôt ceci:

var response
  = db.Responses.Where(y => y.ResponseId.Equals(item.ResponseId)).FirstOrDefault();

if (response != null)
{
    // take some alternative action
}
else
    temp.Response = response;

L'extension FirstOrDefault() renvoie la valeur par défaut d'un objet si aucune correspondance n'est trouvée. Pour la plupart des objets (autres que les types primitifs), il s'agit de null.

6
Grant

Dans la ligne suivante.

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

Vous appelez d'abord mais la collection est revenue de db.Responses.Where est vide.

0
Gary