2011-12-19 32 views
6

Tôi đang tìm một truy vấn LINQ đơn giản đẹp có thể nhận được một mục trong bộ sưu tập của một bộ sưu tập. Hãy xem xét các mô hình sau ...LINQ: Tìm kiếm một bộ sưu tập trong một bộ sưu tập cho một đối tượng duy nhất

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

class Order 
{ 
    int ID; 
} 

phép nói rằng tôi có một danh sách các loại khách hàng ...

List<Customer> Customers; 

Những gì tôi muốn là một single thứ tự dựa trên ID của Đặt hàng (đây là dữ liệu đầu vào đã biết của tôi). Tôi cũng có thể giả định rằng một thứ tự là duy nhất cho một khách hàng (do đó sẽ chỉ là một thứ tự với ID Tôi đang tìm kiếm trên tất cả các khách hàng)

Có một truy vấn LINQ đẹp tôi có thể sử dụng để có được những thứ tự Tôi đang tìm?

Tôi biết tôi có thể dễ dàng thực hiện việc này qua một danh sách Đơn đặt hàng, nhưng đây là thiết lập mà tôi phải làm việc. Tôi không muốn truy vấn thêm dữ liệu, ff Tôi đã có đủ bộ nhớ để có được những gì tôi cần.

Tôi có thể thực hiện việc này bằng vòng lặp bán lộn xộn. Có lẽ tôi chỉ nên làm điều này? Có lẽ tôi đang cố gắng đơn giản hóa mã quá nhiều?

Trả lời

13

Rất tiếc, không nhận định câu hỏi:

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

var order = matchingOrders.Single(); 

Như trong một phiên bản trước của câu trả lời này, lưu ý rằng điều này sẽ thất bại nếu không có trận đấu như vậy hay nhiều hơn một. Bạn cũng có thể muốn xem SingleOrDefault, FirstFirstOrDefault.

Mã này cũng có thể được viết mà không cần biểu thức truy vấn sử dụng SelectMany:

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

Lưu ý rằng bạn không cần phải sử dụng Where và sau đó Single - có một tình trạng quá tải Single tham gia một vị ngữ (và tương tự như vậy cho FirstOrDefault v.v.). Cho dù bạn sử dụng biểu mẫu truy vấn hay không tùy thuộc vào bạn - tôi thường là sử dụng biểu thức truy vấn thay vì SelectMany, nhưng trong trường hợp này bạn không cần khách hàng, vì vậy bạn có thể sử dụng quá tải đơn giản SelectMany.

+0

này không trả lời câu hỏi của tôi. Tôi muốn một mục Đơn hàng không phải là Khách hàng. Xấu đủ bạn không đọc câu hỏi của tôi đúng cách, nhưng 4 cử tri cũng không đọc nó? không phải là một ngày tốt – musefan

+0

@musefan: Rất tiếc, đã đọc sai - hãy xem ngay bây giờ. –

+1

phục hồi tốt;) 'SelectMany' là những gì tôi đang tìm kiếm, đã không nhận ra rằng đã tồn tại. Cung cấp cho tôi một bộ sưu tập ghép nối để làm việc với vì vậy tôi thích điều đó. Không phải là một fan của các biểu thức truy vấn - dường như không đủ mã cho tôi – musefan

2

đây 2 là thứ tự id

var selectedOrder = customers.SelectMany(cc => cc.Orders.Where(cc1 => cc1.ID == 2)).FirstOrDefault(); 
Các vấn đề liên quan