Подтвердить что ты не робот

Группа LINQ затем упорядочивает группы результатов

У меня есть таблица, которая имеет следующие 3 столбца, ID, ShortCode, UploadDate.

Я хочу использовать LINQ для группировки результатов по короткому коду (и сохранять все результаты), затем заказывать эти группы и возвращать список.

У меня есть следующее:

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList<PDFDocument>().
GroupBy(b=>b.ShortCode)
.SelectMany(b=>b).ToList<PDFDocument>()

Я хочу вернуть все результаты, сгруппированные по ShortCode, элементы в каждой группе, отсортированные по UploadDate, и группы, отсортированные так, чтобы они имели самый последний документ в нем.

Кто-нибудь знает, возможно ли это?

4b9b3361

Ответ 1

Try

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
    .AsEnumerable()
    .OrderByDescending(d => d.UploadDate)
    .GroupBy(d => d.ShortCode)
    .SelectMany(g => g)
    .ToList();

Это должно

  • Заказ товаров по дате загрузки (по убыванию, начиная с самого первого)
  • Затем сгруппируйте их по короткому коду - поэтому внутри каждой группы элементы по-прежнему сортируются
  • Группы по-прежнему находятся в порядке убывания, поэтому нет необходимости снова заказывать
  • Наконец, конкатенация результатов в один список

Если производительность является проблемой, вам будет намного лучше делать

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
    .AsEnumerable()
    .GroupBy(d => d.ShortCode)
    .Select(g => g.OrderByDescending(d => d.UploadDate))
    .OrderByDescending(e => e.First().UploadDate)
    .SelectMany(e => e)
    .ToList();

который сортирует содержимое каждой группы отдельно, а не сортирует все сначала, а затем группирует.

Ответ 2

На самом деле, вы не хотите группировать по короткому коду, вы хотите заказать их. Поэтому следующий запрос должен сделать трюк:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.OrderBy(b => b.ShortCode)
.ThenBy(b => b.UploadDate)
.ToList()

Edit Если вы действительно хотите использовать GroupBy, вы можете сделать это следующим образом:

 rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.GroupBy(b => b.ShortCode)
.SelectMany(grouping => grouping.OrderBy(b => b.UploadDate))
.ToList()

Но я отговариваю это. Нет смысла создавать группы, если вы не хотите, чтобы группы были в первую очередь!

Второе редактирование

Я не хотел, чтобы вы хотели группы, заказанные UpdateTime. Это немного усложняет запрос:

rawData.Provider.CreateQuery<PDFDocument>(qb.rootExperession)
.ToList()
.GroupBy(b => b.ShortCode)
.Select(grouping => grouping.OrderByDescending(b => b.UploadDate))
.OrderByDescending(grouping => grouping.First().UploadDate)
.SelectMany(grouping => grouping)
.ToList()