【问题标题】:Retrieve SiteMapNode matching custom attribute using LINQ使用 LINQ 检索与自定义属性匹配的 SiteMapNode
【发布时间】:2012-01-26 19:14:54
【问题描述】:

我是 LINQ 的新手。我有一个带有自定义属性的普通 siteMap XML 文档。这些属性之一是:id

我想使用 LINQ 检索与自定义属性 (id) 的值匹配的单个节点。

等等

我对 LINQ 的尝试如下所示:

private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId)
{
    var pageNode = from SiteMapNode node in nodes.Cast<SiteMapNode>()
                   where node["id"] == Convert.ToString(siteMapNodeId)
                   select node;

    return (SiteMapNode)pageNode;
}

在调试期间,pageNode 被分配:

{System.Linq.Enumerable.WhereEnumerableIterator<System.Web.SiteMapNode>}

在 return 语句中抛出 InvalidCastException:

Unable to cast object of type 'WhereEnumerableIterator`1[System.Web.SiteMapNode]' to type 'System.Web.SiteMapNode'.

感谢任何帮助! :)

编辑:我在这里以更清晰的方式重新发布了这个问题:Re-worded Question

感谢 Stefan 让我走上正轨!

【问题讨论】:

    标签: c# xml linq sitemap custom-attributes


    【解决方案1】:

    您尝试将IEnumerable&lt;SiteMapNode&gt; 转换为SiteMapNode。使用First过滤并返回一个节点:

    return nodes
      .Cast<SiteMapNode>()
      .First(node => node["id"] == Convert.ToString(siteMapNodeId));
    

    【讨论】:

    • 感谢您的建议。我用您提供的代码替换了 FindNodeById 方法中的代码。但是,我现在收到 InvalidOperationException:序列不包含匹配元素。事实上,似乎 lambda 表达式根本没有发挥作用。即使我将其更改为使用强类型属性之一(url 或标题),我仍然会收到 InvalidOperationException 错误。有什么想法吗?
    • 我做了更多的测试,确实 lambda 表达式正在工作,除了 SiteMap XML 文件中的强类型属性(url、标题、描述),而不是自定义属性( id、isHeaderItem 等)...我开始认为您不能在 lambda 中使用自定义属性,而且我可耻地在网上找不到任何关于此的内容。
    • 有点老问题,但如果只有一个节点预计匹配 SingleSingleOrDefault 会更具体(从而传达正确的含义)并另外确保你没有重复的 ID。
    【解决方案2】:

    pageNode 是节点的序列

    您想调用First() 来获取序列中的第一项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2015-09-01
      相关资源
      最近更新 更多