我是LINQ的新手。我有一个具有自定义属性的普通siteMap XML文档。其中一个属性是:编号使用LINQ检索与自定义属性匹配的SiteMapNode
我想使用LINQ来检索与自定义属性(id)的值匹配的单个节点。
等
我在LINQ的尝试看起来是这样的:
{System.Linq.Enumerable.WhereEnumerableIterator<System.Web.SiteMapNode>}
,而在返回语句中引发InvalidCastException:
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变为与分配:
Unable to cast object of type 'WhereEnumerableIterator`1[System.Web.SiteMapNode]' to type 'System.Web.SiteMapNode'.
任何帮助表示赞赏! :)
编辑:我重新张贴在一个更清晰的方式在这里这样的问题:Re-worded Question
感谢斯特凡为把我在正确的轨道上!
感谢您的建议。我用您提供的代码替换了FindNodeById方法中的代码。但是,我现在收到一个InvalidOperationException:序列不包含匹配的元素。事实上,它似乎并没有像lambda表达式那样起作用。即使我将其更改为使用其中一个强类型属性(url或title),我仍然会得到InvalidOperationException错误。有任何想法吗? – Craig
我做了一些更多的测试,实际上lambda表达式正在工作,除了SiteMap XML文件(url,title,description)中的强类型属性,而不是自定义属性(id,isHeaderItem等)。 ..我开始认为你不能在一个lambda中使用一个自定义属性,并且我可耻地无法在网络上找到任何有关这个的东西。 – Craig
这是一个老问题,但是如果只有一个节点需要匹配'Single'或'SingleOrDefault'会更具体(因此表达了正确的含义)并且另外确保您没有重复的ID。 –