使用LINQ计数按父元素分组的xelement

本文关键字:xelement 元素 LINQ 使用 | 更新日期: 2023-09-27 18:03:40

考虑以下XML…

<stock>
    <dealer>
        <dealername>Dealer 1</dealername>
        <vehicle>
            <stockID>11111</stockID>
            ...
        </vehicle>
        <vehicle>
            <stockID>22222</stockID>
            ...                
        </vehicle>
        <vehicle>
            <stockID>33333</stockID>
            ...
        </vehicle>
    </dealer>
    <dealer>
        <dealername>Dealer 2</dealername>
        <vehicle>
            <stockID>44444</stockID>
            ...
        </vehicle>
        <vehicle>
            <stockID>55555</stockID>
            ...                
        </vehicle>
    </dealer>
</stock>

我需要解析这个XML并插入包含…的db记录

Dealer Name
Count of Vehicles for that Dealer Name

…因此,对于上面的例子,这将是…

DealerName    Count of Vehicles
Dealer 1      3
Dealer 2      2

我正在使用以下LINQ代码,但我似乎无法得到我需要的结果…

// count the number of vehicles by dealer name
var qry = from dealer in downloadedXml.Descendants("dealername")
          group dealer by dealer.Value
          into grp
          select new {
             DealerName = grp.Key,
             Count = grp.Select(x => x.Descendants("vehicle")).Distinct().Count()
          };
foreach (var row in qry.OrderBy(x => x.DealerName)) {
    // do db insert
}

使用LINQ计数按父元素分组的xelement

试试这个查询:

var result = from d in doc.Descendants("dealer")
    select new
    {
        Name = d.Element("dealername").Value,
        Total = d.Descendants("vehicle").Count()
    };

你可以这样做

XDocument doc = XDocument.Load(@"E:'test'r.xml");
var data =
   doc.Descendants("stock").Elements("dealer")
      .Select(
              a =>
                  new
                     {
                       DealerName = a.Element("dealername").Value,
                       VehiclesCount = a.Descendants("vehicle").Count()
                     });
foreach (var d in data)
{
    Console.WriteLine(d.DealerName);
    Console.WriteLine(d.VehiclesCount);
}