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

时间:2011-12-19 16:05:17

标签: c# linq

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

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

class Order
{
   int ID;
}

假设我有一个类型客户列表...

List<Customer> Customers;

我想要的是基于订单ID的 单订单 (这是我已知的输入数据)。我也可以假设订单对于客户来说是唯一的(因此只有一个订单具有我正在寻找所有客户的ID)

我可以使用一个很好的LINQ查询来获取我要查找的订单吗?

我知道我可以轻松地在一个Orders列表中执行此操作,但这是我必须使用的设置。我不想查询更多数据,如果我已经有足够的内存来获取我需要的数据。

我可以用半凌乱的for循环来做到这一点。也许我应该这样做?也许我试图过多地简化代码?

2 个答案:

答案 0 :(得分:14)

哎呀,误读了这个问题:

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

var order = matchingOrders.Single();

与此答案的早期版本一样,请注意,如果没有此类匹配或多个匹配,则会失败。您可能还想查看SingleOrDefaultFirstFirstOrDefault

使用SelectMany

也可以在没有查询表达式的情况下编写此代码
var order = customers.SelectMany(customer => customer.Orders)
                     .Single(order => order.ID == orderID);

请注意,需要使用Where然后Single - 有Single重载使用谓词(同样适用于{{1}等)。您是否使用查询表达式表单取决于您 - 我通常使用查询表达式而不是FirstOrDefault,但在这种情况下您不需要客户,因此您可以使用SelectMany的简单重载。

答案 1 :(得分:2)

这里2是订单ID

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