J'ai une fonction qui va comme ceci:S'il vous plaît expliquer ce comportement
IEnumerable<News> articles = _repository.GetLatestNews();
foreach (News news in articles) {
news.IsFetched = true;
_repository.Save();
}
return Json(articles, JsonRequestBehavior.AllowGet);
qui ne renvoie pas de données JSON (et je suis sûr qu'il devrait y avoir une sortie, parce que je peux déboguer dans la boucle foreach).
Quand je change le code à ce qui suit:
IEnumerable<News> articles = _repository.GetLatestNews();
var jsonArticles = articles.ToList();
foreach (News news in articles) {
news.IsFetched = true;
}
_repository.Save();
return Json(jsonArticles, JsonRequestBehavior.AllowGet);
-je obtenir la sortie désirée.
Maintenant je suis curieux, pourquoi cela se produit-il? Quelle est la raison de ce comportement?
Les 'articles' sont-ils remplis lorsque vous définissez un point d'arrêt sur l'instruction' return'? –
Cela doit être indépendant de JSON et MVC alors. Je suppose que le résultat de GetLatestNews() de linq2sql est un énumérable qui déclenche une requête chaque fois que vous l'énumérez. Dans le foreach vous modifiez les éléments d'une manière qu'ils sont exclus du résultat de la requête par la suite. Lorsque vous appelez le sérialiseur JSON qui énumère à nouveau IEnumerable, déclenche à nouveau une requête et obtient un résultat différent à cette heure. Si vous appelez ToList(), il charge les données dans une liste en mémoire et vous pouvez l'énumérer autant de fois que vous le souhaitez sans relancer la requête. –