2017-07-05 15 views
1

私はこれを使って作業しようとしてきましたが、データをグループ化する際に問題があります。 私はその後、私はグループのデータに望んでいた私に18000を与え、LINQから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> 

私はちょうどバランス要素

var doc = XDocument.Load("test.xml"); 

var sum = (from nd in doc.Descendants("BALANCE") 
      select Int32.Parse(nd.Value)).Sum(); 

Console.WriteLine(sum); 

、それが働いたのすべてのSUMを取得しようとして始めたXML構造を持っていますPLAN_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] {キー= "001"、TOT = 0}
  • [1] {キー= "002"、TOT = 0}私がうまくいかなかった

+1

使用' Descendants'、ない 'Elements' .Descendants( "BALANCE") '。 – juharr

答えて

1

問題は、探している要素が単一のレベルよりもXMLツリーの方が深い場合にElements()を使用していることです。内側のクエリ内でDescendants()に切り替えると、期待している結果が得られるはずです。

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

BALANCEノードは、3つのノードが各PLANノードの内部ノードよりも深いので、このトリックを行う必要があります。

それはここでラムダ構文を使用して、関連するソリューションがありますので、ちょうど完全を期すため、ビットクリーンなので個人的に、私はラムダバージョンを使用したいと:GR `のように

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

それは、多くのありがとう! –