我有一个经典的订单 - > 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列表?
答案 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();