2009-08-21 9 views
0

例:私は顧客のインメモリリストを持っています。すべての顧客は注文のリストを持っています。すべての注文には商品のリストがあります。すべてのアイテムにはアイテムコードがあります。子リストの選択、グループ化 - >要求された単一の文

この商品を注文した顧客の下に、その商品コードでグループ化された商品のリストを取得する必要があります。顧客がアイテムを2回以上注文した場合でも、1人の人として表示する必要があります。

これは私が行うことはできますが、1つのLINQコマンドでは実行できないクエリです。それは1つのステートメントで行うことができますか?私はそれが単一のクエリである限り、それが20行になることは気にしません。

これは挑戦です!他のソリューションを提案しないでください。 ;-)

答えて

2

これはあなたのオブジェクトのリスト、各々が1つの項目とそれを買った顧客の個別のリストを取得します。

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
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("----------"); 
} 
関連する問題