2011-12-19 4 views
6

컬렉션의 컬렉션에있는 항목을 얻을 수있는 멋진 간단한 LINQ 쿼리를 찾고 있습니다.LINQ : 단일 개체에 대한 컬렉션 내의 컬렉션 검색

List<Customer> Customers; 

는 내가 원하는 것은의 ID를 기반으로 단일 주문입니다 ...

class Customer 
{ 
    List<Order> Orders; 
    int ID; 
} 

class Order 
{ 
    int ID; 
} 

내가 형 고객의 목록을 가지고 말할 수 있습니다 ... 다음 모델을 고려 주문 (이것은 내가 알고있는 입력 데이터 임). 나는 또한 주문 고객에게 고유 한 것으로 가정 할 수있다 (그래서 단지 내가 모든 고객에 걸쳐 찾고 있어요 ID가 하나 개의 주문이있을 것이다)

나는 주문을 얻을하는 데 사용할 수있는 좋은 LINQ 쿼리가 있습니까 내가 찾고 있어요?

나는 하나의 주문 목록을 통해이를 쉽게 수행 할 수 있지만이 설정은 내가해야하는 설정입니다. 나는 내가 필요한 것을 얻기 위해 이미 충분한 메모리를 가지고 있다면, 더 많은 데이터를 요구하고 싶지는 않다.

나는 반쯤 지저분한 for 루프로 이것을 할 수있다. 아마 내가해야 할 것 같은데? 어쩌면 코드를 너무 단순화하려고 노력 중입니까? ,이 답변의 이전 버전에서와 마찬가지로

var matchingOrders = from customer in customers 
        from order in customer.Orders 
        where order.ID == orderID 
        select order; 

var order = matchingOrders.Single(); 

이러한 일치 또는 하나 이상이없는 경우이 실패합니다 참고 :

답변

13

아차는 질문을 오해. SingleOrDefault, FirstFirstOrDefault을보고 싶을 수도 있습니다.

이 코드는 쿼리 표현 SelectMany 사용하지 않고 쓸 수있다 : 당신이하지이 Where를 사용해야 할

var order = customers.SelectMany(customer => customer.Orders) 
        .Single(order => order.ID == orderID); 

참고 다음 Single을 - 거기 술어를 복용 Single 과부하를 (그리고 마찬가지로 FirstOrDefault 등). 쿼리 표현식을 사용하든 사용하지 않든간에 나는 대신 SelectMany이 아닌 쿼리 식을 사용합니다.이 경우에는 고객이 필요하지 않으므로 SelectMany이라는 단순한 오버로드를 사용할 수 있습니다.

+0

입니다. 고객이 아닌 주문 상품을 원합니다. 네가 내 질문을 제대로 읽지 못할 정도는 아니지만 4 명의 유권자도 그걸 읽지 않니? 좋은 하루가 아니야 – musefan

+0

@musefan : 오소리, 오독 - 지금보세요. –

+1

좋은 회복;)'SelectMany'는 제가 찾고 있던 것이고, 그것이 존재한다는 것을 깨닫지 못했습니다. 저와 함께 작업 할 수있는 연결 모음을 제공하므로 저도 좋아합니다. 쿼리 식의 팬이 아닙니다. 저에게 충분한 코드가 아닙니다. – musefan

2

여기에 2 이것은 내 질문에 대답하지 않는 주문 ID

var selectedOrder = customers.SelectMany(cc => cc.Orders.Where(cc1 => cc1.ID == 2)).FirstOrDefault();