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}]
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.
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
.
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.