【问题标题】:LINQ - Groupy by for complex xmlLINQ - 复杂 xml 的分组依据
【发布时间】:2012-12-12 06:31:48
【问题描述】:

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

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

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

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。

【问题讨论】:

  • 首先,据我所知,它与 XML 无关——您只是对对象列表进行 LINQ 查询。因此,为了帮助我们帮助您,最好使用 getcustomerdata 方法提供类声明

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


【解决方案1】:

如果您正确解析客户,那么您的查询应该如下所示:

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

【讨论】:

  • 它看起来不错,但我仍然无法在没有测试的情况下编写 LINQ,所以我的 +1 将在我测试后出现:)
  • 是的 +1,SelectMany 很好用。我希望我可以再添加一个 +1,查询非常好 :)
  • 我不是提问者,所以很遗憾我不能:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多