LINQ to XML聚合和分组

时间:2014-02-05 19:50:53

标签: c# xml linq linq-to-xml

我正在尝试在LINQ to XML中执行SUM和Group By。我也在使用LINQPad 4来测试我的linq。由于某种原因,rate = g.Sum(taxRate)给我一个FormatException错误。我很确定这个LINQ查询也可以被清除。我知道“Taxrate”可以是一个空字符串,我希望默认为0或忽略任何空。有什么建议吗?

var tax = from taxRate in TaxRates.Descendants("Code")
          where 
          taxRate.Attribute("taxrate") != null 
          &&
          Int32.Parse(taxRate.Attribute("taxyear").Value) == TaxYear
          group taxRate by taxRate.Attribute("taxunitid").Value into g
          select new
          {
              ID = g.Key,
              rate = g.Sum(taxRate => Decimal.Parse(taxRate.Attribute("taxrate").Value))
          };
taxRatesByTaxUnit.Dump();

以下是一些示例xml。

<Code taxyear="2005" tusfundid="12" cycleid="575" taxunitid="198674" taxrate=".214000000"/>
<Code taxyear="2005" tusfundid="13" cycleid="575" taxunitid="198674" taxrate=".004"/>
<Code taxyear="2005" tusfundid="13" cycleid="575" taxunitid="198674" taxrate=""/>
<Code taxyear="2005" tusfundid="13" cycleid="575" taxunitid="100000" taxrate=""/>

我希望能够取回

taxunit id: 198674: taxrate = .218  
taxunit id: 100000: taxrate = .000  

1 个答案:

答案 0 :(得分:0)

好的,考虑到空字符串的税率应该被视为0&#34;,我可能会将其分解为单独的方法。它比尝试内联更简单。然后,我会在任何地方使用显式转换。

类似于:

private decimal GetTaxRate(XElement code)
{
    XAttribute rateAttribute = code.Attribute("taxRate");
    return (string) rateAttribute == "" ? 0m : (decimal) rateAttribute;
}

...

var query = from code in TaxRates.Descendants("Code")
            where (int?) code.Attribute("taxyear") == TaxYear
               && code.Attribute("taxRate") != null
            group code by (string) code.Attribute("taxunitid") into g
            select new {
                ID = g.Key,
                rate = g.Sum(code => GetTaxRate(code))
            };
query.Dump();