C# LINQ:在集合中搜索单个对象的集合
我正在寻找一个很好的简单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的单订单(这是我已知的
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:对于短查询,扩展方法语法很好。当涉及到加入、分组等问题时,它们非常方便。这两种风格都值得熟悉。