2010-08-06 67 views
1

我想下面的Roles拉出到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; 
    } 

我的问题是关于这个LINQ的声明推迟执行。我的理解是,当我返回这个ProjectContact时,Linq语句还没有执行。有没有办法强制执行这个语句,以便它在这个方法中发生,而不是当有人试图访问角色时?我想我可以通过调用.Count()来强制执行语句,但似乎应该有更好的方法。

+0

对不起,没有完成的问题,它张贴!我会写完我的问题,一分钟:) – JSprang 2010-08-06 15:49:53

+0

好的,问题现在在那里。 – JSprang 2010-08-06 15:54:29

+0

角色是IEnumerable >,对此感到遗憾。 – JSprang 2010-08-06 15:59:05

回答

2

projectContact.Roles将是一个IEnumerable<KeyValuePair<int, string>>是你想要的,或者你想要它作为一个List或DIctionary?对于列表,只需在语句结尾处添加.ToList()即可。

对于字典,这是一个有点棘手:

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>>。从技术上讲,这可能是一个词典或列表,但在前一种情况下,你真的不能通过该界面使用它的Dictionary-ness。对于这个问题,你可以在后一种情况下使用它的大部分List-ness,但是你似乎并不想要这个能力。

因此,在.ToList();。它将成为幕后的List,但不会过于冗长,用户仍然只能将其用作IEnumerable。

+0

在ProjectContact上,我确实希望角色是IEnumerable。原因是我不希望对象的用户能够编辑角色集合。如果我将它作为List或Dictionary,他们将能够将Add()添加到它。那有意义吗? – JSprang 2010-08-06 16:07:02

+0

啊,是的!这就说得通了!感谢您的解释! – JSprang 2010-08-06 16:20:05

+0

@JSPrang:但请注意,“extradinary长度”几乎只是铸造... – 2010-08-06 16:22:49

2

如果.Roles的数据类型是数组,则可以简单地在.Select()之后附加.ToArray(),这样可以确保执行查询。

无论采用哪种方式,您都可以执行ToList().ToArray(),您将执行查询。

相关问题