示例:我有一个内存中的客户列表。每个客户都有一份订单清单。每个订单都有一个项目列表。每个项目都有一个项目代码。
我需要获取按商品代码分组的商品列表,其下方是订购此商品的客户。如果客户订购了两件或两件以上的商品,他仍应作为一个人展示。
这是我可以执行的查询,但不能在单个LINQ命令中执行。可以在一份声明中完成吗?我不在乎它是20行,只要它是一个查询。
这是一个挑战!不建议其他解决方案。; - )
答案 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("----------");
}