Linq使用Group by

时间:2009-11-11 08:11:56

标签: c# linq

我希望得到基于Category总计的以下内容

<?xml version="1.0" encoding="utf-8" ?> 
- <Data>
- <Products>
  <Product ProductId="1001" ProductName="p1" category="A1" 
  ProductPrice="123.45" /> 

  <Product ProductId="1002" ProductName="p2" category="B1"
   ProductPrice="100.45" /> 

  <Product ProductId="1003" ProductName="p3" category="A1"
   ProductPrice="223.45" /> 

  <Product ProductId="1004" ProductName="p4" category="B1"
   ProductPrice="200.45" /> 
  </Products>
....

在下面实现它需要什么修改?(没有返回 我的查询)

 XDocument doc = XDocument.Load("Product.xml");

 var sum = from p in doc.Descendants("Product")
           group p by p.Attribute("Category") 
           into g
           select new { category = g.Key,
           total = g.Sum(p =>(double)p.Attribute("ProductPrice")) };

1 个答案:

答案 0 :(得分:3)

您的示例数据显示“类别”属性,但您在查询中使用“类别”。

看起来查询应该除此之外几乎可以工作 - 尽管我再次强烈敦促您使用decimal而不是double来代价。

编辑:正如Konamiman现在删除的答案所说,你需要按属性 value 而不是属性本身进行分组。此代码有效(并使用十进制):

var sum = from p in doc.Descendants("Product")
          group p by p.Attribute("category").Value
          into g
          select new { category = g.Key,
                       total = g.Sum(p => (decimal) p.Attribute("ProductPrice"))
          };