2009-08-21 1 views
0

예 : 고객이 메모리 목록에 있습니다. 모든 고객에게는 주문 목록이 있습니다. 모든 주문에는 품목 목록이 있습니다. 모든 항목에는 항목 코드가 있습니다.하위 목록에서 선택, 그룹화 -> 단일 명령문이 요청 됨

항목 코드로 그룹화 된 항목 목록을 가져와야하며 그 아래에는이 항목을 주문한 고객이 필요합니다. 고객이 항목을 두 번 이상 주문한 경우에도 그는 한 사람으로 표시해야합니다.

하나의 LINQ 명령에서 수행 할 수있는 쿼리입니다. 그것은 하나의 진술로 끝날 수 있습니까? 나는 그것이 하나의 질의 인 한 그것이 20 라인 일 것이라는 것에 상관하지 않는다.

이것은 어려운 문제입니다. 다른 해결책을 제안하지 마십시오. 이것은 당신이 개체의 목록을 가져옵니다 ;-)

답변

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
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("----------"); 
} 
관련 문제