LINQ:在一个集合中搜索单个对象的集合
问题描述:
我正在寻找一个很好的简单LINQ查询,它可以获取集合中某个集合的一个项目。考虑下面的模型......LINQ:在一个集合中搜索单个对象的集合
class Customer
{
List<Order> Orders;
int ID;
}
class Order
{
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位最高选民不会阅读吗?不是美好的一天 – musefan 2011-12-19 16:11:10
@musefan:哎呀,误读 - 现在看看。 – 2011-12-19 16:15:39
恢复很好;)'SelectMany'就是我在找的东西,没有意识到存在。给我一个串联的集合来处理,所以我喜欢这样。不是我自己的查询表达式的粉丝 - 对我来说似乎不够代码 - – musefan 2011-12-19 16:25:10