2011-06-19 11 views
0

この動作を説明してください:(と私は確信している私は、foreachループ内でデバッグすることができますので、いくつかの出力がなければならない任意のJSONデータを返しません私はこのように書き機能を持っている

IEnumerable<News> articles = _repository.GetLatestNews(); 

foreach (News news in articles) { 
    news.IsFetched = true; 
    _repository.Save(); 
} 
return Json(articles, JsonRequestBehavior.AllowGet); 

)。

私は、次のコードを変更:

IEnumerable<News> articles = _repository.GetLatestNews(); 
var jsonArticles = articles.ToList(); 

foreach (News news in articles) { 
    news.IsFetched = true; 
} 
_repository.Save(); 

return Json(jsonArticles, JsonRequestBehavior.AllowGet); 

私が所望の出力を得ます。

今私は不思議ですが、なぜこれが起こりますか?この行動の理由は何ですか?実際に実行し、熱心にデータをフェッチするクエリを強制的に

var jsonArticles = articles.ToList(); 

+0

'' return'文でブレークポイントを設定すると、 'articles'に値が入りますか? –

+2

JSONとMVCから独立している必要があります。私の推測では、linq2sqlのGetLatestNews()の結果は、列挙するたびにクエリを起動する列挙型であると考えられます。 foreachでは、後で照会結果から除外されるように項目を変更します。 IEnumerableを再び列挙するJSONシリアライザを呼び出すと、再度クエリが実行され、その時とは異なる結果が得られます。 ToList()を呼び出すと、メモリ内のリストにデータがロードされます。クエリを再実行しないで、必要なだけ何度でも列挙できます。 –

答えて

1

それはこのラインです。 GetLatestNewsメソッドによって返された列挙体を列挙するまで、結果は返されません。