2011-06-19 5 views
0

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?

+0

Les 'articles' sont-ils remplis lorsque vous définissez un point d'arrêt sur l'instruction' return'? –

+2

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. –

Répondre

1

Il est cette ligne:

var jsonArticles = articles.ToList(); 

qui oblige en fait la requête à exécuter et avec impatience récupérer les données. Aucun résultat ne sera renvoyé tant que vous n'aurez pas énuméré l'énumération renvoyée par la méthode GetLatestNews.

Questions connexes