2011-08-05 13 views
4

でのLINQを使うように見えることはできませんSelectedの値はitemですが、NavigationMenu.Itemsにエラーが表示されます。唯一IEnumerable、ないIEnumerable<T>実装し、私はNavigationMenu.Itemsを疑うは、私は次のコードを持ってASP.Netナビゲーションメニュー

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

:私はwhere句をコメントアウトすると

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'.

は、私はこのエラーを取得します。この問題を解決するには、あなたはおそらく、クエリで明示的に要素の型を指定することによって行うことができ、 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

ああ...すごいトリックです!先に「キャスト」について知りたいと思う。 – Tim

関連する問題