Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将LINQ中的值分组/求和到XML?_C#_Xml_Linq - Fatal编程技术网

C# 如何将LINQ中的值分组/求和到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>

我一直在努力解决这个问题,但我在分组数据时遇到了问题。 我有一个XML结构

<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"))
         });