2011-06-19 110 views
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); 

我得到所需的輸出。

現在我很好奇,爲什麼會發生這種情況?這種行爲的原因是什麼?

+0

當您在'return'語句中設置斷點時'articles'是否被填充? –

+2

然後,它必須獨立於JSON和MVC。我的猜測是,來自linq2sql的GetLatestNews()的結果是一個可枚舉的枚舉,每當枚舉它時都會觸發查詢。在foreach中,您可以按照以下方式從查詢結果中排除這些項目。當您調用再次枚舉IEnumerable的JSON序列化程序時,將再次觸發查詢,並在此時獲得不同的結果。如果您調用ToList(),它會將數據加載到內存列表中,並且可以根據需要枚舉它,而無需再次運行查詢。 –

回答

1

在這條線:

var jsonArticles = articles.ToList(); 

實際強制查詢執行並急切地獲取數據。除非您開始枚舉GetLatestNews方法返回的枚舉值,否則不會返回任何結果。