2010-08-06 7 views
1

나는 내 질문이 Linq에 문의 지연된 실행에 대한 인 IEnumerable<KeyValuePair<int, string>>Linq : XML을 IEnumerable <KeyValuePair <int, string>> 지연 실행 하시겠습니까?

<PROJECT PROJECT_NO="161917"> 
    <CONTACT CLIENT_ID="030423253272735482765C" CONTACT_NO="1"> 
    <ROLE ROLE_ID="2" ROLE_DESC="ARCHITECT" /> 
    <ROLE ROLE_ID="5" ROLE_DESC="INTEGRATOR" /> 
    </CONTACT> 
</PROJECT> 



private static ProjectContact BuildProjectContactFromXml(XElement xml) 
    { 
     ProjectContact projectContact = new ProjectContact(); 
     projectContact.ProjectId = SafeConvert.ToInt32(xml.Attribute("PROJECT_NO").Value); 
     projectContact.Roles = xml.Elements() 
            .First() 
            .Elements() 
            .Select(role => new KeyValuePair<int, string>(
                  SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value), 
                  role.Attribute("ROLE_DESC").Value)); 

     return projectContact; 
    } 

에 아래 Roles를 꺼내려고 해요. 이 ProjectContact를 반환하면 Linq 문이 아직 실행되지 않았다는 것을 이해합니다. 누군가이 역할에 액세스하려고 할 때가 아니라이 방법으로이 명령문을 강제로 실행하는 방법이 있습니까? 나는 그것이 .Count()를 호출하여 명령문을 강제로 실행할 수 있다고 생각하지만 더 나은 방법이 있어야하는 것처럼 보입니다.

+0

죄송합니다. 질문이 끝나지 않아 게시되었습니다. 내 질문을 작성하는 것을 끝내겠다. :) – JSprang

+0

자, 이제 질문이있다. – JSprang

+0

역할은 IEnumerable >입니다. 죄송합니다. – JSprang

답변

2

projectContact.Roles이 될 것입니다. IEnumerable<KeyValuePair<int, string>>은 원하는 것입니까, 아니면 목록이나 DITIONARY로 하시겠습니까? 목록의 경우 문장의 끝에 .ToList()을 붙이면됩니다. 하여 Dictionary에 대한

, 그것은 조금 복잡합니다 :

projectContact.Roles = xml.Elements() 
           .First() 
           .Elements() 
           .ToDictionary(
       role=> SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value), 
       role=> role.Attribute("ROLE_DESC").Value)); 

업데이트 : 당신이 코멘트에서 해당 역할 ID IEnumerable<KeyValuePair<int, string>>을 명시. 전문적으로, 사전이나 목록 일 수 있지만, 전자의 경우에는 인터페이스를 통해 사전을 사용할 수 없습니다. 그 문제에 관해서는 후자의 경우 List-ness를 많이 사용할 수 있지만 특히 그 능력을 원하지 않는 것 같습니다.

그래서 tack on .ToList();. 그것은 뒤에서 List가 될 것입니다. 그러나 extradinary 길이를 사용하지 않고도 사용자는 IEnumerable로만 사용할 수 있습니다.

+0

ProjectContact에서 역할을 IEnumerable로 지정합니다. 그 이유는 개체 사용자가 역할 모음을 편집 할 수 없기 때문입니다. 목록이나 사전을 만들면 Add()를 할 수 있습니다. 말이 돼? – JSprang

+0

아, 그래! 그건 의미가 있습니다! 설명 주셔서 감사합니다! – JSprang

+0

@JSPrang : "extradinary lengths"는 거의 그냥 캐스팅하는 것입니다. –

2

.Roles의 데이터 유형이 배열 인 경우 .Select() 뒤에 .ToArray()을 추가하기 만하면 쿼리가 실행됩니다.

어느 쪽이든 ToList() 또는 .ToArray()을 실행하면 쿼리가 실행됩니다.

관련 문제