LINQ:在集合中查找单个对象的子集合

6

我希望您能提供一个简洁易懂的LINQ查询,用于获取一个包含在集合中的子集合中的项目。考虑以下模型...

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

class Order
{
   int ID;
}

假设我有一个名为"customer"的列表...
List<Customer> Customers;

我想要的是基于订单ID的“单个订单”(这是我的已知输入数据)。我也可以假设订单对客户是唯一的(因此,在所有客户中,只有一个具有我正在查找的ID的订单)。
是否有一个好的LINQ查询可以用来获取我要查找的订单?
我知道我可以很容易地在一个订单列表上执行此操作,但这是我必须处理的设置。如果我已经有足够的内存来获得所需的内容,则不想查询更多数据。
我可以使用半混乱的for循环来完成这项工作。也许我应该直接这样做?也许我正在试图让代码过于简化?
2个回答

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方法接受一个谓词(同样适用于FirstOrDefault等)。无论你使用查询表达式形式与否取决于你自己 - 我通常使用查询表达式而非SelectMany,但在这种情况下,你不需要顾客,所以可以使用SelectMany的简单重载。


这并没有回答我的问题。我想要一个订单项目而不是客户。你没有正确阅读我的问题已经够糟糕的了,但是四个点赞者也没有读懂它?今天不太好。 - musefan
1
好的恢复 ;) SelectMany 就是我在寻找的,没想到它存在。它给了我一个可以操作的连接集合,所以我很喜欢它。我个人不太喜欢查询表达式——对我来说似乎不够代码化。 - musefan
1
@musefan:对于简短的查询,扩展方法语法很好用。但是当涉及到连接、分组等操作时,它们非常方便。值得熟悉两种风格。 - Jon Skeet

2

这里的2是订单号

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接