LINQ - 用于复杂xml的分组

时间:2012-12-12 06:31:49

标签: c# linq-to-xml linq-to-objects

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

1 个答案:

答案 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; }
}