2012-01-26 3 views
1

LINQ를 처음 사용합니다. 나는 사용자 정의 속성을 가진 일반 siteMap XML 문서를 가지고있다. 이러한 특성 중 하나는 다음과 같습니다. idLINQ를 사용하여 SiteMapNode와 일치하는 사용자 지정 특성 검색

LINQ를 사용하여 사용자 지정 특성 (id) 값과 일치하는 단일 노드를 검색하고 싶습니다.

LINQ에서 내 시도는 다음과 같습니다

:

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

그리고 InvalidCastException이가 발생 return 문의 :

디버깅하는 동안
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이 발생합니다. 시퀀스에 일치하는 요소가 없습니다. 사실, 람다식이 전혀 작동하지 않는 것처럼 보입니다. 강력한 형식의 특성 (URL 또는 제목) 중 하나를 사용하도록 변경하더라도 InvalidOperationException 오류가 발생합니다. 어떤 아이디어? – Craig

+0

더 많은 테스트를 해봤지만 실제로는 람다식이 작동하고 있습니다. 사용자 지정 태그 (id, isHeaderItem 등)가 아닌 SiteMap XML 파일 (url, title, description)의 강력한 형식의 특성 만 제외하고 실제로 작동합니다. .. 나는 람다 (lambda)에서 사용자 정의 속성을 사용할 수 없다고 생각하기 시작했으며 부끄럽게도 이것에 관해서는 아무것도 찾을 수 없습니다. – Craig

+0

낡은 질문이지만, 단 하나의 노드 만이 'Single'또는 'SingleOrDefault'와 일치 할 것으로 예상되면 더 구체적입니다 (따라서 적절한 의미를 전달함). 또한 중복 ID가 없는지 확인하십시오. –

관련 문제