2011-12-19 111 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(); 
相关问题