Группа 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, и группы, отсортированные так, чтобы они имели самый последний документ в нем.
Кто-нибудь знает, возможно ли это?
Ответы
Ответ 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()