2012-01-26 40 views
1

我是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

感谢斯特凡为把我在正确的轨道上!

回答

0

pageNode是节点的序列

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

1

您试图将IEnumerable<SiteMapNode>投射到SiteMapNode。使用First来过滤并返回一个节点:

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

感谢您的建议。我用您提供的代码替换了FindNodeById方法中的代码。但是,我现在收到一个InvalidOperationException:序列不包含匹配的元素。事实上,它似乎并没有像lambda表达式那样起作用。即使我将其更改为使用其中一个强类型属性(url或title),我仍然会得到InvalidOperationException错误。有任何想法吗? – Craig

+0

我做了一些更多的测试,实际上lambda表达式正在工作,除了SiteMap XML文件(url,title,description)中的强类型属性,而不是自定义属性(id,isHeaderItem等)。 ..我开始认为你不能在一个lambda中使用一个自定义属性,并且我可耻地无法在网络上找到任何有关这个的东西。 – Craig

+0

这是一个老问题,但是如果只有一个节点需要匹配'Single'或'SingleOrDefault'会更具体(因此表达了正确的含义)并且另外确保您没有重复的ID。 –