2009-09-10 4 views
1

아래 XML을 통해, 나는 InputItem을 기준으로 그룹화하고 모든 연도의 비용을 합산해야합니다. 그래서 결과는 다음과 같아야합니다LINQ에서 XML로 그룹화 및 합계

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

어떻게 해결할 수 있습니까? int 그렇지 않으면 괜찮을 것 - 당신이 분수 구성 요소가있을 수 있습니다 통화 상대하고 의심 때문에 내가 decimal을 사용하고

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

답변

1

나는 group by 절에서 Value를 사용하여 방금 누락 된 것처럼 보입니다. 여기 내 작업 솔루션입니다 : BTW

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

당신은 ... 뭔가를해야합니다.