我正在尝试将下面的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()强制执行语句,但似乎应该有更好的方法。
答案 0 :(得分:2)
projectContact.Roles
将是IEnumerable<KeyValuePair<int, string>>
是你想要的,还是你想要它作为List或DIctionary?对于List,只需在语句末尾添加.ToList()
。
对于词典,它有点棘手:
projectContact.Roles = xml.Elements()
.First()
.Elements()
.ToDictionary(
role=> SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value),
role=> role.Attribute("ROLE_DESC").Value));
更新:在您的评论中,您声明角色为IEnumerable<KeyValuePair<int, string>>
。从技术上讲,这可能是一个词典或一个列表,虽然在前一种情况下,你真的不能通过该接口使用它的Dictionary-ness。就此而言,在后一种情况下你可以使用它的大部分列表 - 但似乎你特别不想要那种能力。
所以,坚持.ToList();
。它将是幕后的List,但是如果没有额外的长度,用户仍然只能将它用作IEnumerable。
答案 1 :(得分:2)
如果.Roles
的数据类型是数组,则只需在.ToArray()
之后附加.Select()
,这样可以确保执行查询。
无论哪种方式,您都可以执行ToList()
或.ToArray()
,然后执行查询。