0
我有一個是這樣的一個功能:請解釋這種行爲
IEnumerable<News> articles = _repository.GetLatestNews();
foreach (News news in articles) {
news.IsFetched = true;
_repository.Save();
}
return Json(articles, JsonRequestBehavior.AllowGet);
這並不返回任何JSON數據(我敢肯定,應該有一定的輸出,因爲我可以在foreach循環內調試)。
當我改變代碼如下:
IEnumerable<News> articles = _repository.GetLatestNews();
var jsonArticles = articles.ToList();
foreach (News news in articles) {
news.IsFetched = true;
}
_repository.Save();
return Json(jsonArticles, JsonRequestBehavior.AllowGet);
我得到所需的輸出。
現在我很好奇,爲什麼會發生這種情況?這種行爲的原因是什麼?
當您在'return'語句中設置斷點時'articles'是否被填充? –
然後,它必須獨立於JSON和MVC。我的猜測是,來自linq2sql的GetLatestNews()的結果是一個可枚舉的枚舉,每當枚舉它時都會觸發查詢。在foreach中,您可以按照以下方式從查詢結果中排除這些項目。當您調用再次枚舉IEnumerable的JSON序列化程序時,將再次觸發查詢,並在此時獲得不同的結果。如果您調用ToList(),它會將數據加載到內存列表中,並且可以根據需要枚舉它,而無需再次運行查詢。 –