1

Roles我正在尝试将以下内容拉出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() 来强制执行该语句,但似乎应该有更好的方法。

4

2 回答 2

2

projectContact.RolesIEnumerable<KeyValuePair<int, string>>是你想要的,还是你想要它作为列表或字典?对于列表,只需.ToList()在语句末尾添加即可。

对于字典,它有点棘手:

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

更新:在您的评论中,您声明 Roles id IEnumerable<KeyValuePair<int, string>>。从技术上讲,它可以是字典或列表,尽管在前一种情况下,您确实不能通过该接口使用它的字典特性。就此而言,您可以在后一种情况下使用它的大部分 List-ness - 但似乎您特别不想要这种能力。

所以,继续.ToList();。这将是一个幕后的列表,但无需特别冗长,用户仍然只能将其用作 IEnumerable。

于 2010-08-06T15:58:38.047 回答
2

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

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

于 2010-08-06T15:59:04.343 回答