Linq在XML元素上的位置/分组

时间:2013-12-03 12:05:09

标签: c# xml linq

我有一个XML文件,结构如下:

<RS>
    <R>
        <C0>14</C0>
        <C1>2013-11-29</C1>
        <C2>14:29:59</C2>
        <C3>289824328</C3>
        <C4>COMPANY NAME</C4>
        <C5>Top Customers</C5>
        <C6>14:29</C6>
    </R>
    <R>...</R>
</RS>

我是Linq的新手并试图让我了解如何根据以下标准返回查询:

Select C4 As Customer, Sum(C0) As Total
Where C5 = "Top Customers"
Group By C4

我已经根据Where和Group返回了正确的行,但无法理解我如何对C0元素求和。我在VS2013中使用C#:

XDocument xTest = XDocument.Load("ReportData.xml");

var query = from c in xTest.Descendants("R")
    where c.Element("C5").Value == "Top Customers"
    group c by c.Element("C4") into d
    select new {
        Customer = d.Key.Value,
        Total = ???
    };

任何人都可以帮助最后一块吗??

干杯,

罗伊

1 个答案:

答案 0 :(得分:3)

您需要描述要汇总的元素,在本例中为元素C0

var query = from c in elem.Descendants("R")
    where (string)c.Element("C5") == "Top Customers"
    group c by (string)c.Element("C4") into d
    select new {
        Customer = d.Key,
        Total = d.Sum(x=>(int?)x.Element("C0"))
    };

一些注意事项:

  • XElement分组不起作用;即使它们具有相同的值,它也会将不同的元素分成两组。相反,请考虑按.Value分组或转换为string
  • 通常最好将XElement强制转换为可空类型,而不是使用.Value属性。如果没有匹配元素,则转换仍然有效,但.Value将导致NullReferenceException。请参阅here

      

    然而,使用C#,铸造通常是更好的方法。如果将元素或属性强制转换为可空类型,则在检索可能存在或可能不存在的元素(或属性)的值时,代码更易于编写。

  •