LINQ - select()

Есть два класса:

 public class Order
 {
    public long Id {get;set;}
    public string OtherData {get;set;}
    public List<Item> Items {get;set;}

    public long UserId {get;set;}
 }
 
 public class Item
 {
    public long Id {get;set;}
    public Order Order {get;set;}
    public OrderId {get;set;}
    public string OtherData {get;set;}
 }

И по определённым причинам мне необходимо из БД брать данные в таком виде:

        List<string> orderIds = {}; // список ордеров, которые нужно вытащить из БД
        var items = _dbContext.Items
            .Include(item => item.Order)
            .Where(item => item.Order.UserId == userId) // userId определён по коду заранее
            .Where(item => orderIds.Contains(item.OrderId))
            .ToList();

И всё бы ничего, код работает, но далее мне нужно взять список ордеров:

        var orders = items.Select(x => x.Order).ToList();

И если среди items окажутся такие item, которые принадлежат одному ордеру, то вполне логично среди orders окажутся дубликаты. Собственно, вопрос: как можно группировку сделать? Или как можно брать только уникальные order?

Пока единственное, до чего я дошёл:

List<Order> uniqueOrders = new List<Order>();
foreach (var order in orders)
{
    if (!uniqueOrders.Any(x => x.Id == order.Id))
         uniqueOrders.Add(order);
}

Но меня не покидает ощущение, что в LINQ нужный мне функционал уже заложен, а я не совладал с гуглом и не смог такой функционал найти.


Ответы (2 шт):

Автор решения: xxramm

Попробуйте так:

var noUniqOrders = items.Select(x => x.Order).ToList();
var orders = noUniqOrders.Distinct(x => x.Id);

Т.е. если Id из базы, то distinct выберет только уникальные orders.

→ Ссылка
Автор решения: Svyatoslav Danyliv

Я бы слегка развернул запрос и сначала выбрал ордера с ихними деталями

List<string> orderIds = {}; // список ордеров, которые нужно вытащить из БД
var orders = _dbContext.Orders
    .Include(o => o.Items)
    .Where(o => o.UserId == userId) // userId определён по коду заранее
    .Where(o => orderIds.Contains(o.Id))
    .ToList();

var items = orders.SelectMany(o => o.Items).ToList();
→ Ссылка