Группировка и суммирование в LINQ to XML - PullRequest
1 голос
/ 10 сентября 2009

Учитывая приведенный ниже 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 ]

2 голосов
/ 10 сентября 2009

Тебе нужно что-то вроде ...

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 будет хорошо.

1 голос
/ 10 сентября 2009

Похоже, я просто пропустил использование Value в выражении group by. Вот мое рабочее решение:

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)
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...