C# LINQ:在集合中搜索单个对象的集合

C# LINQ:在集合中搜索单个对象的集合,c#,linq,C#,Linq,我正在寻找一个很好的简单LINQ查询,它可以获取集合集合中的项。考虑下面的模型… class Customer { List<Order> Orders; int ID; } class Order { int ID; } class客户 { 列出订单; int-ID; } 阶级秩序 { int-ID; } 假设我有一个客户类型列表 List<Customer> Customers; 列出客户; 我想要的是一个基于订单ID的单订单(这是我已知的

我正在寻找一个很好的简单LINQ查询,它可以获取集合集合中的项。考虑下面的模型…

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

class Order
{
   int ID;
}
class客户
{
列出订单;
int-ID;
}
阶级秩序
{
int-ID;
}
假设我有一个客户类型列表

List<Customer> Customers;
列出客户;
我想要的是一个基于订单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();
与此答案的早期版本一样,请注意,如果不存在此类匹配项或多个匹配项,则此操作将失败。您可能还需要查看
SingleOrDefault
First
FirstOrDefault

也可以使用
SelectMany
,在不使用查询表达式的情况下编写此代码:

var order = customers.SelectMany(customer => customer.Orders)
                     .Single(order => order.ID == orderID);
请注意,您不需要使用
Where
然后使用
Single
——有一个
Single
重载来执行谓词(同样,对于
FirstOrDefault
等)。您是否使用查询表达式表单取决于您-我通常使用查询表达式而不是
SelectMany
,但在这种情况下,您不需要客户,因此您可以使用
SelectMany

的简单重载,这里2是订单id

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

这并不能回答我的问题。我要的是订单项,不是客户。够糟糕的了,你没有正确地阅读我的问题,但是4个以上的选民也没有阅读?不是好日子好恢复;)
SelectMany
是我一直在寻找的,但我不知道它的存在。给了我一个串联的集合,所以我喜欢。我自己也不喜欢查询表达式——对我来说似乎不够代码化me@musefan:对于短查询,扩展方法语法很好。当涉及到加入、分组等问题时,它们非常方便。这两种风格都值得熟悉。