我有一个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 = ???
};
任何人都可以帮助最后一块吗??
干杯,
罗伊
答案 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#,铸造通常是更好的方法。如果将元素或属性强制转换为可空类型,则在检索可能存在或可能不存在的元素(或属性)的值时,代码更易于编写。