группировать по имени и упорядочивать по дате и каждый групповой порядок по дате в linq

#c# #.net

#c# #.net

Вопрос:

У меня есть следующая таблица.
Дата именования
A 04.10.2016
A 10/03/2016
A 05.10.2016
B 02.10.2016
B 01.10.2016
B 03.10.2016
B 03.10.2016
C 05.10.2016
C 02.10.2016 В 10.04.2016 В

Я хотел бы отобразить это
Имя Дата
B 10/01/2016
B 10/02/2016
B 10/03/2016
C 10/02/2016
C 10/04/2016
C 10/05/2016
A 10/03/2016
A 10/04/2016
A 10/05/2016

Как создать запрос, чтобы получить этот результат.

Комментарии:

1. какие-либо усилия с вашей стороны?

Ответ №1:

 var elements = new[]
{
    new { Name = "A", Date = DateTime.Parse("10/04/2016") },
    new { Name = "A", Date = DateTime.Parse("10/03/2016") },
    new { Name = "A", Date = DateTime.Parse("10/05/2016") },

    new { Name = "B", Date = DateTime.Parse("10/02/2016") },
    new { Name = "B", Date = DateTime.Parse("10/01/2016") },
    new { Name = "B", Date = DateTime.Parse("10/03/2016") },

    new { Name = "C", Date = DateTime.Parse("10/05/2016") },
    new { Name = "C", Date = DateTime.Parse("10/02/2016") },
    new { Name = "C", Date = DateTime.Parse("10/04/2016") },
};

// LINQ to Objects
elements
    .GroupBy(e => e.Name)                         // grouping by name                
    .Select(group => group.OrderBy(e => e.Date))  // order elements by date      
    .OrderBy(group => group.First().Date)         // order groups by date
    .SelectMany(group => group);                  // compose groups 

// LINQ to Entities
elements
    .GroupBy(e => e.Name)
    .Select(group => group.OrderBy(e => e.Date))
    .OrderBy(group => group.FirstOrDefault().Date)                   
    .AsEnumerable()
    .SelectMany(group => group);
  

Комментарии:

1. Мой запрос — var group = db.Routearies .GroupBy (d => d.JobListID) . Выберите(g => g.OrderBy(d => d.DutyDate)) .OrderBy(e => e.First().DutyDate) . Выберите MANY(e => e) . ToList();

2. Но у меня ошибка «Метод ‘First’ может использоваться только в качестве окончательной операции запроса. Рассмотрите возможность использования метода ‘FirstOrDefault’ в этом случае вместо этого.» Я заменяю First() на FirstOrDefault(). Он отображается некорректно

3. @NayLinHtike добавил возможное решение для LINQ для сущностей.

Ответ №2:

Вероятно, вам не нужен groupby, но только orderby может полностью выполнить вашу задачу:

 yourList.OrderBy(l => l.Date).ThenBy(l => l.Name)
  

Ответ №3:

Было бы здорово, если бы вы предоставили больше информации. Например, тип объекта, содержащий данные. Это пользовательская модель или DataTable? В любом случае, я попробую и то, и другое.

 var result = dataTable.Rows.AsEnumerable().GroupBy(x => x.Name).OrderBy(x => x.Date);
  

или

 var result = Foo.GroupBy(x => x.Name).OrderBy(x => x.Date);
  

Комментарии:

1. мой запрос выглядит как «db.table. AsEnumerable().GroupBy(x=>x.Name ). Порядок (x=x.Дата);

2. Тогда все должно быть в порядке. Хотя я заметил, что в OrderBy у вас есть опечатка. Вы пропали без вести > до x.Дата. Он должен гласить x => x.Date

Ответ №4:

https://dotnetfiddle.net/0SfhAz

Это проблема с кодом. По какой-то причине я не могу заставить скрипку выписывать значения из списка.

Первоначально я сделал это в LINQPad, и вот результат, который я получил из кода в скрипке, когда в LINQPad

  1. B 10/1/2016
  2. B 10/2/2016
  3. B 3.10.2016
  4. C 10/2/2016
  5. C 10/4/2016
  6. C 10/5/2016
  7. A 3.10.2016
  8. A 10/4/2016
  9. A 5/10/2016

Я не знаю, почему я не могу просто выполнить строку записи на скрипте .net, но это сложно. В случае, если скрипка не работает для вас, вот запрос linq, который я использовал для этого

var Упорядоченный список = originalList.OrderBy(x => x.someDate).GroupBy(y => y.Name );

Могут быть подходы получше, но это, похоже, решит вашу проблему