我正在寻找一个简单的LINQ查询,它可以获取集合集合中的项目。考虑以下模型......
class Customer
{
List<Order> Orders;
int ID;
}
class Order
{
int ID;
}
假设我有一个类型客户列表...
List<Customer> Customers;
我想要的是基于订单ID的 单订单 (这是我已知的输入数据)。我也可以假设订单对于客户来说是唯一的(因此只有一个订单具有我正在寻找所有客户的ID)
我可以使用一个很好的LINQ查询来获取我要查找的订单吗?
我知道我可以轻松地在一个Orders列表中执行此操作,但这是我必须使用的设置。我不想查询更多数据,如果我已经有足够的内存来获取我需要的数据。
我可以用半凌乱的for循环来做到这一点。也许我应该这样做?也许我试图过多地简化代码?
答案 0 :(得分:14)
哎呀,误读了这个问题:
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
重载使用谓词(同样适用于{{1}等)。您是否使用查询表达式表单取决于您 - 我通常使用查询表达式而不是FirstOrDefault
,但在这种情况下您不需要客户,因此您可以使用SelectMany
的简单重载。
答案 1 :(得分:2)
这里2是订单ID
var selectedOrder = customers.SelectMany(cc => cc.Orders.Where(cc1 => cc1.ID == 2)).FirstOrDefault();