2014-02-05 35 views
0

我的網站導航有一個類別的概念,有一個描述,圖像和頁面與他們相關聯。Linq to XML這個XML文件讀取多少次?

In _ViewStart.cshtml我有以下LINQ查詢,然後將結果存儲在PageData中,因爲我可能在給定頁面上多次使用類別,並且不想重新運行查詢。

XDocument navigation = XDocument.Load(Server.MapPath("~/App_Data/Navigation.xml")); 
IEnumerable<Category> categories = from category in navigation.Root.Descendants("category") 
            select new Category(
             category.Attribute("name").Value, 
             category.Element("description").Value, 
             new CategoryImage(
              category.Element("image").Element("path").Value, 
              category.Element("image").Element("cssClass").Value, 
              category.Element("image").Element("description").Value 
             ), 
             (from page in category.Descendants("page") select new BetterSolutions.ViewModels.ProductPage(page.Attribute("display").Value, page.Value)).ToList() 
            ); 
PageData["categories"] = categories; 

當我看到通過調試器會發生什麼,只要我訪問PageData [「類別」]它不斷回到過去的_ViewStart.cshtml查詢。

當我通過在LINQ查詢周圍添加括號並在末尾添加.ToList()來更改上述代碼時,它似乎執行一次,然後再也不會再執行一次。

我應該這樣做的方式是什麼?我認爲添加.ToList()是正確的,因爲查詢似乎只運行一次,但我可能會誤解LINQ to XML中的延遲執行實際上是如何工作的。

回答

1

什麼方式我應該這樣做呢?我認爲添加.ToList()是正確的,因爲查詢似乎只運行一次,但我可能會誤解LINQ to XML中的延遲執行實際上是如何工作的。

你看到的是延期執行。當你創建你的categories時,它不是一個項目集合:它只是一個查詢,當需要結果時,它將被執行。並且該查詢定義存儲在PageData["categories"]中。所以每次從它那裏拿到它,你都必須執行它才能獲得結果。

添加ToList()使結果成爲必要,因爲您要求結果列表。之後,該列表被存儲在PageData["categories"]中。這就是爲什麼您不必一遍又一遍地執行查詢的原因:因爲您已經將結果存儲在列表中,並且您甚至不知道以前的結果來自哪裏。

什麼是正確的路要走?這取決於。如果您希望文件在PageData["categories"]調用之間更改,並且您需要它始終返回準確的結果,則可以使用當前的解決方案。如果文件沒有改變,或者確定不要只讀取一次文件,並放棄在程序執行期間對文件所做的所有更改,則應該使用ToList()以使其性能更好並避免不必要的文件訪問。

更新

我主要回答是不完全正確的。即使沒有ToList()訪問PageData["categories"]也不會再次訪問該文件,因爲該文件已被完全加載並解析爲XDocument實例。但它會遍歷文檔本身來執行查詢。

+0

這很有道理。當我創建類別時,C#知道查詢的結果將會是IEnumerable ?否則,我不應該在編譯時遇到錯誤? – Jon

+0

是的,查詢的類型是返回'Category'項目的集合。 – MarcinJuraszek

+0

@Jon我不得不修改我的答案。檢查更新。 – MarcinJuraszek

0

它看起來像你忘了給ToList()調用的類: 簡單的解決將是:

PageData["categories"] = categories.ToList(); 
+0

他沒有忘記 - 「我應該怎麼做?我認爲加入。ToList()是正確的,因爲查詢似乎只運行一次,但我可能會誤解LINQ to XML中延遲執行的實際工作方式。' – DGibbs