我有以下XML: -
<customer>
<id>ALFKI</id>
<name>Alfreds Futterkiste</name>
<address>Obere Str. 57</address>
<city>Berlin</city>
<postalcode>12209</postalcode>
<country>Germany</country>
<phone>030-0074321</phone>
<fax>030-0076545</fax>
<orders>
<order>
<id>10643</id>
<orderdate>1997-08-25T00:00:00</orderdate>
<total>814.50</total>
</order>
<order>
<id>10692</id>
<orderdate>1997-10-03T00:00:00</orderdate>
<total>878.00</total>
</order>
</orders>
</customer>
我想以下列格式获取数据: - 国家名称:德国 城市名称:柏林 订单:orderid1,orderid2 ......
城市名称:曼海姆 订单:orderid1,orderid2等..
即。对于每个国家,各自的城市以及该城市的所有秩序。
我使用以下查询,通过该查询我可以对国家及其城市进行分组,但我无法获取该国家/地区的订单: -
List<Customer> Customers = GetCustomerData();
var query = (from cust in Customers
from ord in cust.Orders
group cust by cust.Country into CountryGroup
select new
{
CountryName = CountryGroup.Key,
CityGroup = (from c in CountryGroup
where c.Country == CountryGroup.Key
group c by c.City into CityGroup
select new
{
CityName = CityGroup.Key
})
});
GetCustomerData的代码: -
CustomerList = (from e in XDocument.Load(@"D:\Console Application\LINQDemo\GroupingOperators\GroupingOperators\XMLFiles\Customers.xml").Root.Elements("customer")
select new Customer
{
CustomerID = (string)e.Element("id"),
CustomerName = (string)e.Element("name"),
Address = (string)e.Element("address"),
City = (string)e.Element("city"),
Region = (string)e.Element("region"),
PostalCode = (string)e.Element("postalcode"),
Country = (string)e.Element("country"),
PhoneNo = (string)e.Element("phone"),
Fax = (string)e.Element("fax"),
Orders = (from o in e.Element("orders").Elements("order")
select new Order
{
OrderID = (int)o.Element("id"),
OrderDate = (DateTime)o.Element("orderdate"),
OrderTotal = (decimal)o.Element("total")
}).ToArray()
}).ToList();
请帮助!
TIA。
答案 0 :(得分:4)
如果您正确解析客户,那么您的查询应如下所示:
var query = from cust in Customers
group cust by new { cust.Country, cust.City } into g
select new
{
CountryName = g.Key.Country,
CityGroup = g.Key.City,
Orders = g.SelectMany(c => c.Orders)
};
这里是解析(以防万一):
private List<Customer> GetCustomerData()
{
XDocument xdoc = XDocument.Load(path_to_xml);
return xdoc.Descendants("customer")
.Select(c => new Customer()
{
Id = (string)c.Element("id"),
Name = (string)c.Element("name"),
Address = (string)c.Element("address"),
Country = (string)c.Element("country"),
City = (string)c.Element("city"),
Orders = c.Descendants("order")
.Select(o => new Order()
{
Id = (int)o.Element("id"),
Date = (DateTime)o.Element("orderdate"),
Total = (decimal)o.Element("total")
}).ToList()
}).ToList();
}
我使用以下课程(没有邮政编码,传真和电话)
public class Customer
{
public string Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string Country { get; set; }
public string City { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
public DateTime Date { get; set; }
public decimal Total { get; set; }
}