2009-09-10 4 views
1

Учитывая приведенный ниже XML, мне нужно сгруппировать по InputItem и суммировать затраты на все годы. Таким образом, результаты должны быть:Группировка и суммирование в LINQ to XML

  1. Исследовательские контракты, 7000
  2. Технические контракты, 5000
  3. Hospitality, 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)); 

Как это исправить?

ответ

1

Похоже, что мне просто не хватало значения в группе по предложению. Вот мой рабочий раствор:

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

Кстати, я получил помощь из этой статьи: http://blog.blocks4.net/post/2007/08/Querying-XML-documents-with-LINQ-to-XML .aspx – Graeme

2

Вам нужно что-то вроде ...

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, потому что я подозреваю, что вы имеете дело с валютой, которые могут иметь дробную составляющую - int иначе было бы хорошо.

Смежные вопросы