2011-08-05 54 views
4

我有下面的代碼:似乎無法使用Linq與ASP.Net導航菜單

 // Iterate through the root menu items in the Items collection. 
     foreach (MenuItem item in NavigationMenu.Items) 
     { 
      if (item.NavigateUrl.ToLower() == ThisPage.ToLower()) 
      { 
       item.Selected = true; 
      } 
     } 

我想的是:

var item = from i in NavigationMenu.Items 
      where i.NavigateUrl.ToLower() == ThisPage.ToLower() 
      select i; 

然後我可以設置Selected的值爲item,但它在NavigationMenu.Items上給我一個錯誤。

Error 5 Could not find an implementation of the query pattern for source type 'System.Web.UI.WebControls.MenuItemCollection'. 'Where' not found. Consider explicitly specifying the type of the range variable 'i'.

當我註釋掉where條款,我得到這個錯誤:

Error 22 Could not find an implementation of the query pattern for source type 'System.Web.UI.WebControls.MenuItemCollection'. 'Select' not found. Consider explicitly specifying the type of the range variable 'i'.

+0

什麼錯誤? – Tim

+0

爲了將來的參考,真的很值得閱讀錯誤信息 - 它給出和我一樣的建議:明確指定範圍變量的類型。 –

+0

當我註釋到Linq語句的where部分時,會發生這個消息。當我取消註釋「where」聲明時,它給了我一個不同的錯誤。 –

回答

5

我懷疑NavigationMenu.Items只實現IEnumerable,不IEnumerable<T>。爲了解決這個問題,你可能希望通過明確在查詢中的元素類型調用Cast,這是可以做到:

var item = from MenuItem i in NavigationMenu.Items 
      where i.NavigateUrl.ToLower() == ThisPage.ToLower() 
      select i; 

但是,您的查詢是誤導命名 - 這是一個事物的序列,而不是單個項目。

我還建議使用StringComparison來比較字符串,而不是上層它們。例如:

var items = from MenuItem i in NavigationMenu.Items 
      where i.NavigateUrl.Equals(ThisPage, 
           StringComparison.CurrentCultureIgnoreCase) 
      select i; 

我會再考慮使用擴展方法代替:

var items = NavigationMenu.Items.Cast<MenuItem>() 
      .Where(item => item.NavigateUrl.Equals(ThisPage, 
           StringComparison.CurrentCultureIgnoreCase)); 
+0

哦......這是一個巧妙的把戲!我希望早些時候能夠知道'Cast'。 – Tim