2009-12-05 77 views
3

拥有经典的订单 - >订单行的情况是这样的:我如何获得产品的独特条目列表<Order>与LINQ

public class Order 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<OrderRow> OrderRows { get; set; } 
} 

public class OrderRow 
{ 
    public int Id { get; set; } 
    public int ProductId { get; set; } 
    public int Amount { get; set; } 
} 

和列表<订单>。从订单列表中,我想获得所有独特的ProductIds列表。

我解决了它这样的:

var orders = new List<Order>(); 
// TODO get the orders from DB 
var products = new Dictionary<int,int>(); 
orders.ForEach(order => order.OrderRows.ForEach(row => products[row.ProductId]=row.ProductId)); 

,但我得到了我的使用字典的问题,为什么我没有用LINQs的GroupBy也评论说,这是不是很清楚它是如何工作的。我认为解决方案没问题,但是这些评论让我想尝试在LINQ中解决它,但由于某种原因我尝试了一个砖墙。

如何从LINQ订单列表中获取独特产品ID列表?

回答

7

未经检验的,但如何:

var products = orders.SelectMany(o => o.OrderRows) 
        .Select(r => r.ProductId) 
        .Distinct(); 
+0

就像一个魅力,谢谢!不知何故,我以前完全错过了SelectMany。 – 2009-12-05 23:28:57

1

这应该从订单列表中获得的唯一产品ID。

var orders = new List<Order>(); 

// Get orders from database. 

IEnumerable<int> uniqueIds = orders.SelectMany(order => order.OrderRows) 
    .Select(row => row.ProductId).Distinct(); 
2

如果你不想记住的SelectMany,这查询理解语法仍然会得到你,你想去的地方:

var productIDs = 
(
    from order in orders 
    from orderrow in order.OrderRows 
    select orderrow.ProductId 
).Distinct(); 
+0

不错,很清楚! – 2009-12-06 08:36:36