Linq: группировать по годам и месяцам и управлять пустыми месяцами - PullRequest
8 голосов
/ 22 ноября 2010

У меня есть следующий Linq для группировки списка по годам, а затем по месяцам.

var changesPerYearAndMonth = list
              .GroupBy(revision => new { revision.LocalTimeStamp.Year, revision.LocalTimeStamp.Month })
              .Select(group => new { GroupCriteria = group.Key, Count = group.Count() })
              .OrderBy(x => x.GroupCriteria.Year)
              .ThenBy(x => x.GroupCriteria.Month);

Мой текущий вывод следующий:

Year 2005, month 1, count 469
Year 2005, month 5, count 487
Year 2005, month 9, count 452
Year 2006, month 1, count 412
Year 2006, month 5, count 470
...

Как видите, месяцы без значения не включены в запрос. Я хотел бы включить их, имея следующий вывод:

Year 2005, month 1,  count 469
Year 2005, month 2,  count 0
Year 2005, month 3,  count 0
...
Year 2005, month 12, count 0
Year 2006, month 1,  count 412
Year 2006, month 2,  count 0
...
Year 2006, month 12, count 0

Другими словами, мне нужны также пустые месяцы.

Могу ли я реализовать это с помощью запроса Linq? Заранее спасибо

1 Ответ

18 голосов
/ 22 ноября 2010

Я думаю, вы хотите что-то вроде этого:

var changesPerYearAndMonth =
    from year in Enumerable.Range(2005, 6)
    from month in Enumerable.Range(1, 12)
    let key = new { Year = year, Month = month }
    join revision in list on key
              equals new { revision.LocalTimeStamp.Year, 
                           revision.LocalTimeStamp.Month } into g
    select new { GroupCriteria = key, Count = g.Count() };

Обратите внимание:

  • Вам нужно знать, за какие годы вы пытаетесь получить данные.Конечно, вы можете извлечь это из другого запроса, чтобы найти минимальные и максимальные вовлеченные годы - или, возможно, найти минимум и предположить, что в будущем ничего не будет (хотя я не знаю, является ли это верным предположением или нет)
  • Это будет автоматически заказано правильно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...