2012-01-26 72 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。 –