Как получить уникальные записи продуктов в списке <Order>с помощью LINQ - PullRequest
3 голосов
/ 06 декабря 2009

У меня есть классический сценарий Order -> 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; }
}

и список . Из этого списка заказов я хочу получить список всех уникальных 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 здесь?

Ответы [ 3 ]

7 голосов
/ 06 декабря 2009

Не проверено, но как насчет:

var products = orders.SelectMany(o => o.OrderRows)
                     .Select(r => r.ProductId)
                     .Distinct();
2 голосов
/ 06 декабря 2009

Если вы не хотите помнить SelectMany, этот синтаксис понимания запроса все равно приведет вас туда, куда вы хотите пойти:

var productIDs =
(
  from order in orders
  from orderrow in order.OrderRows
  select orderrow.ProductId
).Distinct();
1 голос
/ 06 декабря 2009

Это должно получить уникальные идентификаторы продукта из списка заказов.

var orders = new List<Order>();

// Get orders from database.

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