2012-01-27 15 views
2

XMLのsiteMapNode要素を使用してWeb.sitemapファイルがあります。各タグにカスタム属性を追加しました。カスタム属性idの値を抽出しようとしています。シーケンスに一致する要素が含まれていません - 返信SiteMapNode LINQを使用してカスタム属性に一致します

idに一致するSiteMapNodeCollectionに1つのsiteMapNodeがあります。私はforeachループを使用してこれを達成することができますが、LINQを使用して短くて甘いものにしたいと考えています。次のように

--DOESN'T WORK-- 関数である:

private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId) 
{ 
    return nodes 
      .Cast<SiteMapNode>() 
      .First(node => node["id"] == Convert.ToString(siteMapNodeId)); 
} 

しかし、私はInvalidOperationExceptionが=>Sequence contains no matching elementを受け取ります。カスタム属性からURL(またはタイトル)などのデフォルトの.NET属性に切り替えると、問題なくノードが返されます。 例えば、この文は、「テスト」に設定されているtitle属性を持つノードに対して問題なく動作します:

--WORKS--

private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId) 
    { 
     return nodes 
      .Cast<SiteMapNode>() 
      .First(node => node.title == "Test"); 
    } 

誰として正しい方向に私を指すことができますカスタム属性の値が.Firstのラムダ式で一致するためには、何が欠けていますか?

何か助けていただきありがとうございます。

素晴らしい週末を過ごしましょう!

クレイグ

答えて

1

FirstOrDefaultに置き換えてください。しかし、クラッシュした場合は、条件を満たす要素がないことを意味し、結果はnullになります。

+0

ご意見ありがとうございます。私はそれを試して、ノードに 'null'を受け取ります。カスタム属性を使用しようとするたびに、ノードは返されません。 LINQは、 'siteMapNode'要素の強く型付けされた属性でのみ動作するようです。 – Craig

+0

しかし、あなたはforeachループで動作すると言っています。なぜ、機械的にlinqクエリに書き換えることはできませんか? – user1096188

関連する問題