Sequence不包含匹配元素 - 使用LINQ返回匹配自定义属性的SiteMapNode

时间:2012-01-27 15:48:27

标签: c# xml linq sitemap custom-attributes

我有一个使用XML中的siteMapNode元素的Web.sitemap文件。我已为每个标记添加了自定义属性。我正在尝试提取自定义属性id的值。

我想在siteMapNode中找到与自定义属性SiteMapNodeCollection匹配的单个id。我能够使用foreach循环来实现这一点,但是我想使用LINQ使它变得简短而甜蜜。

- 不工作 - 功能如下:

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

但是,我收到了InvalidOperationException =&gt; Sequence contains no matching element。如果我从自定义属性切换到默认的.NET属性(例如URL(或标题)),我可以毫无问题地返回节点。 例如,对于title属性设置为“Test”的节点,此语句可以正常运行:

- WORKS -

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

为了让自定义属性值在.First lambda表达式中匹配,有人能指出我正确的方向吗?

我感谢任何帮助。

周末愉快!

克雷格

1 个答案:

答案 0 :(得分:1)

首先使用FirstOrDefault替换。但如果它崩溃,则意味着没有满足条件的元素,因此结果将为null。