如何使用LINQ </order>获取List <order>中产品的唯一条目

时间:2009-12-05 23:01:28

标签: c# linq linq-to-objects

我有一个经典的订单 - &gt; Order Row场景如下:

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; }
}

和List&lt; Order&gt;。从订单列表中我想获得所有唯一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));

但我对使用Dictionary有疑问,为什么我没有使用LINQs GroupBy,并且还评论说它不是很清楚它是如何工作的。我认为解决方案很好,但评论让我想尝试在LINQ中解决它,但出于某种原因,我尝试了一个砖墙。

如何从LINQ订单列表中获取唯一产品ID列表?

3 个答案:

答案 0 :(得分:7)

未经测试,但如何:

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

答案 1 :(得分:2)

如果您不想记住SelectMany,这个查询理解语法仍然可以让您到达目的地:

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

答案 2 :(得分:1)

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

var orders = new List<Order>();

// Get orders from database.

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