2011-12-19 109 views
6

我正在尋找一個很好的簡單LINQ查詢,它可以獲取集合中某個集合的一個項目。考慮下面的模型......LINQ:在一個集合中搜索單個對象的集合

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

class Order 
{ 
    int ID; 
} 

可以說我有類型的客戶名單...

List<Customer> Customers; 

我想是基於對ID的單訂購訂單(這是我已知的輸入數據)。我也可以假設一個訂單對客戶是唯一的(所以只有一個訂單帶有我期待的所有客戶的ID)

是否有一個很好的LINQ查詢我可以用來獲取訂單我在尋找?

我知道我可以很容易地通過一個訂單列表來做到這一點,但這是我必須與之合作的設置。我不想查詢更多的數據,如果我已經有足夠的內存來獲得我需要的數據。

我可以做一個半麻煩for循環。也許我應該這樣做?也許我試圖簡化代碼太多?

回答

13

哎呀,誤解的問題:

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

var order = matchingOrders.Single(); 

正如這個答案的早期版本,請注意,如果沒有這樣的匹配或超過一個,這將失敗。您可能還想看看SingleOrDefault,FirstFirstOrDefault

此代碼也可以寫不使用SelectMany查詢表達式:

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

請注意,您需要使用Where然後Single - 有一個Single超載採取謂詞(以及類似的FirstOrDefault等)。無論您是否使用查詢表達式都取決於您 - 我通常使用查詢表達式而不是SelectMany,但在這種情況下您不需要客戶,因此您可以使用SelectMany的簡單超載。

+0

這不回答我的問題。我想要訂單項目而不是客戶。夠不夠正確地閱讀我的問題,但是4位最高選民不會閱讀嗎?不是美好的一天 – musefan 2011-12-19 16:11:10

+0

@musefan:哎呀,誤讀 - 現在看看。 – 2011-12-19 16:15:39

+1

恢復很好;)'SelectMany'就是我在找的東西,沒有意識到存在。給我一個串聯的集合來處理,所以我喜歡這樣。不是我自己的查詢表達式的粉絲 - 對我來說似乎不夠代碼 - – musefan 2011-12-19 16:25:10

2

這裏2是訂單ID

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