EF Core 5, упорядочить объекты по дате в дочерней коллекции

У меня простое отношение вроде

public class Invoice{
  public int Id {get;set;}
  ICollection Product Products {get;set;}
}

public class Product {
  public int Id {get;set;}
  public DateTime ReceptionDate {get;set;}
  public virtual Invoice Invoice{get;set;}
}

Я хочу выставлять счета-фактуры, заказанные по Product ReceptionDate, поэтому сначала идет счет с самым последним продуктом. Я тоже просматриваю результаты.

Я пытался

invoices.OrderByDescending(x => x.Products.Select(y => y.ReceptionDate)).Skip(x).Take(y);

Но это даже неверный запрос.

Не удалось найти аналогичный вопрос с помощью поиска.

Спасибо.

Изменить: также пробовал решение Сергея, но оно слишком медленное, потому что вызывает ToArray () для извлечения тысяч записей из базы данных.


person Alex Garcia    schedule 11.02.2021    source источник


Ответы (2)


Попробуйте этот запрос:

var query=Products
    .GroupBy(g => new { g.Invoice.Id, g.ReceptionDate})
    .Select(g => new 
        {
           Id=g.Key.Id
           ReceptionDate=g.Key.ReceptionDate
        })
    .OrderBy(x => x.ReceptionDate)
    .ToArray();
person Serge    schedule 11.02.2021
comment
Я не могу использовать этот запрос, у меня тысячи счетов-фактур и продуктов, а вызов ToArray () слишком медленный. Также я не могу использовать Distinct () перед вызовом ToArray () в ef core 5, поскольку он не поддерживается. - person Alex Garcia; 12.02.2021
comment
Я не знал, что у вас будут проблемы с сетевым трафиком. Попробуйте другой запрос. - person Serge; 12.02.2021

Может, тебе стоит попробовать это:

invoices.OrderByDescending(x => x.Products.Max(y => y.ReceptionDate));
person Vladislav Yakovlev    schedule 11.02.2021
comment
Это действительный запрос, но он не упорядочивает счета по дате получения продукта. - person Alex Garcia; 11.02.2021