1

我有以下 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 等。

即对于每个国家,其各自的城市以及该城市的所有orderids。

我正在使用以下查询,通过它我可以对国家及其城市进行分组,但我无法获取该国家的订单:-

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。

4

1 回答 1

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; }
} 
于 2012-12-12T06:52:38.830 回答