使用 linq 将值聚合到 xml

Aggregate a value with linq to xml

我有以下代码:

XElement file = XElement.Load(new XmlNodeReader(FileData));;
var file_data = (
    from hl in imported_file.Descendants("HEADER")
        select new

      {
          Year = ((string)hl.Element("Year")),
          Customer= ((string)hl.Element("Customer")),
           PurchasedItem = (string)hl.Element("PurchasedItem"),

      }).Distinct().GroupBy(a => new { a.Year, a.Customer })

我想 select 一个由 Year、Customer 和逗号分隔的购买项目列表绑定到每个分组的 year/Customer 键。

XML样本

<root>
    <Header>
    <Year>2000</Year>
    <Customer>Jani</Customer>
    <PurchasedItem>item1</PurchasedItem>
    </Header>

    <Header>
    <Year>2002</Year>
    <Customer >Paul</Customer>
    <PurchasedItem>item1</PurchasedItem>
    </Header>

    <Header>
    <Year>2000</Year>
    <Customer>Jani</Customer>
    <PurchasedItem >item2</PurchasedItem>
    </Header>

    <Header>
    <Year>2000</Year>
    <Customer >Jani</Customer>
    <PurchasedItem  >item1</PurchasedItem>
    </Header>

    <Header>
    <Year>2000</Year>
    <Customer >Jani</Customer>
    <PurchasedItem  >item3</PurchasedItem>
    </Header>
</root>

如何做到这一点?

首先 - xml 您发布的内容无效(缺少根元素、不正确的结束标记等)。我已经更正了。

关于你的目标。可以这样实现:

var result = file.Descendants("Header").Select(hl => new
{
    Year = ((string) hl.Element("Year")),
    Customer = ((string) hl.Element("Customer")),
    PurchasedItem = (string) hl.Element("PurchasedItem")
})
.Distinct()
.GroupBy(a => new {a.Year, a.Customer})
.Select(r => new
{
    Year = r.Key.Year,
    Customer = r.Key.Customer,
    Items = String.Join(", ", r.Select(x => x.PurchasedItem))
});

主要想法 - 在使用 GroupBy 对数据进行分组后 - 只需添加一些选择器并根据需要重新排列结果。