C# 使用LINQ检索与自定义属性匹配的SiteMapNode
我是LINQ的新手。我有一个带有自定义属性的普通站点地图XML文档。这些属性之一是:id 我想使用LINQ检索与自定义属性(id)值匹配的单个节点 等等 我对LINQ的尝试如下所示:C# 使用LINQ检索与自定义属性匹配的SiteMapNode,c#,xml,linq,sitemap,custom-attributes,C#,Xml,Linq,Sitemap,Custom Attributes,我是LINQ的新手。我有一个带有自定义属性的普通站点地图XML文档。这些属性之一是:id 我想使用LINQ检索与自定义属性(id)值匹配的单个节点 等等 我对LINQ的尝试如下所示: private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId) { var pageNode = from SiteMapNode node in nodes.Cast<SiteMapNode>()
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;
}
感谢您的帮助!:)
编辑:我在这里以更清晰的方式重新发布了这个问题:
感谢Stefan让我走上正轨
pageNode
是一个节点序列
您需要调用
First()
以获取序列中的第一项。pageNode
是一个节点序列
您需要调用
First()
以获取序列中的第一项。您尝试将IEnumerable
强制转换为SiteMapNode
。使用First
筛选并返回一个节点:
return nodes
.Cast<SiteMapNode>()
.First(node => node["id"] == Convert.ToString(siteMapNodeId));
返回节点
.Cast()
.First(node=>node[“id”]==Convert.ToString(siteMapNodeId));
您尝试将IEnumerable
强制转换为SiteMapNode
。使用First
筛选并返回一个节点:
return nodes
.Cast<SiteMapNode>()
.First(node => node["id"] == Convert.ToString(siteMapNodeId));
返回节点
.Cast()
.First(node=>node[“id”]==Convert.ToString(siteMapNodeId));
谢谢你的建议。我用您提供的代码替换了FindNodeById方法内部的代码。然而,我现在收到一个InvalidOperationException:序列不包含匹配的元素。事实上,lambda表达式似乎根本没有发挥作用。即使我将其更改为使用一个强类型属性(url或标题),仍然会出现InvalidOperationException错误。有什么想法吗?我已经做了更多的测试,事实上lambda表达式正在工作,除了站点地图XML文件中的强类型属性(url、标题、描述),而不是自定义属性(id、isHeaderItem等)…我开始认为你不能在lambda中使用自定义属性,我很遗憾在网上找不到任何与此相关的内容。这是一个老问题,但如果只希望一个节点匹配Single
或SingleOrDefault
,则会更具体(从而传达正确的含义)另外,请确保您没有重复的ID。谢谢您的建议。我用您提供的代码替换了FindNodeById方法内部的代码。然而,我现在收到一个InvalidOperationException:序列不包含匹配的元素。事实上,lambda表达式似乎根本没有发挥作用。即使我将其更改为使用一个强类型属性(url或标题),仍然会出现InvalidOperationException错误。有什么想法吗?我已经做了更多的测试,事实上lambda表达式正在工作,除了站点地图XML文件中的强类型属性(url、标题、描述),而不是自定义属性(id、isHeaderItem等)…我开始认为你不能在lambda中使用自定义属性,我很遗憾在网上找不到任何与此相关的内容。这是一个老问题,但如果只希望一个节点匹配Single
或SingleOrDefault
,则会更具体(从而传达正确的含义)此外,还要确保您没有重复的ID。
return nodes
.Cast<SiteMapNode>()
.First(node => node["id"] == Convert.ToString(siteMapNodeId));