C# 如何将LINQ中的值分组/求和到XML?
我一直在努力解决这个问题,但我在分组数据时遇到了问题。 我有一个XML结构C# 如何将LINQ中的值分组/求和到XML?,c#,xml,linq,C#,Xml,Linq,我一直在努力解决这个问题,但我在分组数据时遇到了问题。 我有一个XML结构 <FILE> <PLAN> <PLAN_ID>001</PLAN_ID> <PARTICIPANT> <PARTICIPANT_ID>9999</PARTICIPANT_ID> <INVESTMENTS> <INVESTMENT>
<FILE>
<PLAN>
<PLAN_ID>001</PLAN_ID>
<PARTICIPANT>
<PARTICIPANT_ID>9999</PARTICIPANT_ID>
<INVESTMENTS>
<INVESTMENT>
<INVESTMENT_ID>ABC</INVESTMENT_ID>
<BALANCE>1000</BALANCE>
<ELECTION>0.00</ELECTION>
</INVESTMENT>
<INVESTMENT>
<INVESTMENT_ID>XYZ</INVESTMENT_ID>
<BALANCE>2000</BALANCE>
<ELECTION>0.00</ELECTION>
</INVESTMENT>
<INVESTMENT>
<INVESTMENT_ID>QWERTY</INVESTMENT_ID>
<BALANCE>3000</BALANCE>
<ELECTION>100.0</ELECTION>
</INVESTMENT>
</INVESTMENTS>
</PARTICIPANT>
</PLAN>
<PLAN>
<PLAN_ID>002</PLAN_ID>
<PARTICIPANT>
<PARTICIPANT_ID>9999</PARTICIPANT_ID>
<INVESTMENTS>
<INVESTMENT>
<INVESTMENT_ID>ABC</INVESTMENT_ID>
<BALANCE>2000</BALANCE>
<ELECTION>0.00</ELECTION>
</INVESTMENT>
<INVESTMENT>
<INVESTMENT_ID>XYZ</INVESTMENT_ID>
<BALANCE>4000</BALANCE>
<ELECTION>0.00</ELECTION>
</INVESTMENT>
<INVESTMENT>
<INVESTMENT_ID>QWERTY</INVESTMENT_ID>
<BALANCE>6000</BALANCE>
<ELECTION>100.0</ELECTION>
</INVESTMENT>
</INVESTMENTS>
</PARTICIPANT>
</PLAN>
</FILE>
这起作用了,给了我18000美元。然后,我想按计划ID对数据进行分组,但我无法让它给我0以外的数据
var doc = XDocument.Load("test.xml");
var q = from x in doc.Descendants("PLAN")
group x by x.Element("PLAN_ID").Value into gr
select new
{
key = gr.Key,
tot = (from tx in gr.Elements("BALANCE")
select (int)tx).Sum()
};
当我跑步时,我得到:
- [0]{key=“001”,tot=0}
- [1] {key=“002”,tot=0}
我哪里出错了?问题是,当您要查找的元素在XML树中比单个级别更深时,您使用的是
Elements()
。如果在内部查询中切换到子体()
,则应该会得到预期的结果
var doc = XDocument.Load("test.xml");
var q = from x in doc.Descendants("PLAN")
group x by x.Element("PLAN_ID").Value into gr
select new
{
key = gr.Key,
tot = (from tx in gr.Descendants("BALANCE")
select (int)tx).Sum()
};
平衡节点比每个计划节点的内部节点深3个节点,因此应该这样做
就我个人而言,我喜欢使用lambda版本,因为它更干净,所以为了完整起见,这里是使用lambda语法的相关解决方案:
var q = doc.Descedants("PLAN")
.GroupBy(x => x.Element("PLAN_ID").Value))
.Select(gr => new
{
key = gr.Key,
tot = gr.Sum(tx => (int)tx.Descendants("BALANCE"))
});
使用
子体
,而不是元素
,如gr.substands(“BALANCE”)
。
var q = doc.Descedants("PLAN")
.GroupBy(x => x.Element("PLAN_ID").Value))
.Select(gr => new
{
key = gr.Key,
tot = gr.Sum(tx => (int)tx.Descendants("BALANCE"))
});