选择,分组子列表 - >要求单一陈述

时间:2009-08-21 09:29:30

标签: c# linq

示例:我有一个内存中的客户列表。每个客户都有一份订单清单。每个订单都有一个项目列表。每个项目都有一个项目代码。

我需要获取按商品代码分组的商品列表,其下方是订购此商品的客户。如果客户订购了两件或两件以上的商品,他仍应作为一个人展示。

这是我可以执行的查询,但不能在单个LINQ命令中执行。可以在一份声明中完成吗?我不在乎它是20行,只要它是一个查询。

这是一个挑战!不建议其他解决方案。; - )

2 个答案:

答案 0 :(得分:2)

这会为您提供一个对象列表,每个对象包含一个项目以及购买它的客户的明确列表:

var items =
   customers
   .SelectMany(c => c.Orders.SelectMany(
      o => o.Items.Select(i => new { item = i, customer = c })
   ))
   .GroupBy(o => o.item.ItemCode)
   .Select(g => new {
      item = g.First().item,
      customers = g.Select(o => o.customer).Distinct()
   });

测试数据:

Customer[] customers = {
   new Customer("John Doe", new Order("A", "B")),
   new Customer("Jane Doe", new Order("B", "C", "D"), new Order("B", "D")),
   new Customer("Ford Prefect", new Order("D"), new Order("A", "E"))
};

结果:

A: John Doe, Ford Prefect
B: John Doe, Jane Doe
C: Jane Doe
D: Jane Doe, Ford Prefect
E: Ford Prefect

答案 1 :(得分:1)

var query = customers
    .SelectMany
    (
        c => c.Orders
            .SelectMany(o => o.Items)
            .Select(i => new { Customer = c, i.ItemCode })
            .Distinct()
    )
    .GroupBy(x => x.ItemCode, x => x.Customer);

// and to quickly display the results...
foreach (var result in query)
{
    Console.WriteLine("Item code: " + result.Key);

    Console.Write("Bought by: ");
    foreach (var customer in result)
    {
        Console.Write(customer.Name + ", ");
    }

    Console.WriteLine();
    Console.WriteLine("----------");
}