質問

以下のXMLを考えると、InputItemでグループ化し、すべての年のコストを合計する必要があります。結果は次のようになります。

  1. 研究契約、7000
  2. 技術契約、5000
  3. ホスピタリティ、2000

XMLは次のとおりです。

<Inputs>
    <Inputs_Table_Row>
        <InputItem>Research Contracts</InputItem>
        <TotalYear1>1000</TotalYear1>
        <TotalYear2>2000</TotalYear2>
    </Inputs_Table_Row>
    <Inputs_Table_Row>
        <InputItem>Research Contracts</InputItem>
        <TotalYear1>2000</TotalYear1>
        <TotalYear2>2000</TotalYear2>
    </Inputs_Table_Row>
    <Inputs_Table_Row>
        <InputItem>Technical Contracts</InputItem>
        <TotalYear1>1000</TotalYear1>
        <TotalYear2>2000</TotalYear2>
    </Inputs_Table_Row>
    <Inputs_Table_Row>
        <InputItem>Technical Contracts</InputItem>
        <TotalYear1>1000</TotalYear1>
        <TotalYear2>1000</TotalYear2>
    </Inputs_Table_Row>
    <Inputs_Table_Row>
        <InputItem>Hospitality</InputItem>
        <TotalYear1>1000</TotalYear1>
        <TotalYear2>1000</TotalYear2>
    </Inputs_Table_Row>
</Inputs>

これまでのグループ化の試みは単純ですが、成功しませんでした:

XDocument doc = XDocument.Load(@"c:\temp\CrpTotalsSimple.xml");

var query = from c in doc.Descendants("Inputs_Table_Row")
            group new
            {
                Item = (string)c.Element("InputItem")
            }
            by c.Element("InputItem")
            into groupedData

            select new
            {
                ItemName = groupedData.Key.Value
            };

foreach (var item in query)
    Console.WriteLine(String.Format("Item: {0}", item.ItemName));

どうすれば修正できますか?

役に立ちましたか?

解決 2

group by句でValueを使用していないように見えます。私の作業ソリューションは次のとおりです。

var query = from c in doc.Descendants("Inputs_Table_Row")
group new
{
    Item = c.Element("InputItem").Value,
    ItemValue = (int)c.Element("TotalYear1") + (int)c.Element("TotalYear2")
 }
 by c.Element("InputItem").Value 
 into groupedData

 select new
 {
      ItemName = groupedData.Key,
      ItemTotal = groupedData.Sum(rec => rec.ItemValue)
  };

他のヒント

次のようなものが必要です...

var query = from yearTotalEl in doc.Descendants()
            where yearTotalEl.Name.LocalName.StartsWith("TotalYear")
            group (decimal)yearTotalEl 
            by (string)yearTotalEl.Parent.Element("InputItem") into g
            select new {ItemName = g.Key, Sum = g.Sum()};

小数部分を持つ通貨を扱っていると思われるため、 decimal を使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top