LINQ: группировка по месяцам и годам в поле даты и времени

У меня есть таблица с полем даты и времени. Я хочу получить набор результатов, сгруппированный по комбинации месяца/года и количеству записей, которые появляются в этом месяце/годе. Как это можно сделать в LINQ?

Самое близкое, что мне удалось выяснить, это TSQL:

select substring(mo,charindex(mo,'/'),50) from (
select mo=convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created)) 
 ,qty=count(convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created)))
from posts 
group by convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created))
) a
order by substring(mo,charindex(mo,'/')+1,50)

Но я бы не сказал, что это работает...


person tsilb    schedule 18.04.2009    source источник


Ответы (5)


var grouped = from p in posts
     group p by new { month = p.Create.Month,year= p.Create.Year } into d
     select new { dt = string.Format("{0}/{1}",d.Key.month,d.Key.year), count = d.Count() };

Вот список функций DateTime, доступных в LINQ. Чтобы это работало, вам также необходимо понимать группировка по нескольким столбцам

по убыванию

var grouped = (from p in posts 
  group p by new { month = p.Create.Month,year= p.Create.Year } into d 
  select new { dt = string.Format("{0}/{1}",d.Key.month,d.Key.year), count = d.Count()}).OrderByDescending (g => g.dt);
person Jeremy    schedule 18.04.2009
comment
я хочу отсортировать это по месяцам, например, первый текущий месяц вверху и предыдущий месяц в следующем и так далее ?? пожалуйста помоги - person Praveen Prasad; 11.10.2010
comment
вы можете сделать это, добавив порядок по убыванию - person Jeremy; 12.10.2010

Это для тех, кто пытается сделать то же самое, но используя лямбда-выражения.

Предположим, что у вас уже есть коллекция сущностей, и каждая сущность имеет OrderDate в качестве одного из своих свойств.

yourCollection
// This will return the list with the most recent date first.
.OrderByDescending(x => x.OrderDate)
.GroupBy(x => new {x.OrderDate.Year, x.OrderDate.Month})
// Bonus: You can use this on a drop down
.Select(x => new SelectListItem
        {
           Value = string.Format("{0}|{1}", x.Key.Year, x.Key.Month),
           Text = string.Format("{0}/{1} (Count: {2})", x.Key.Year, x.Key.Month, x.Count())
        })
.ToList();

Если вам не нужна коллекция SelectListItem, просто замените выбор на этот:

.Select(x => string.Format("{0}/{1} (Count: {2})", x.Key.Year, x.Key.Month, x.Count()))
person Miguel    schedule 03.04.2015

вы также можете сделать это таким образом

from o in yg
group o by o.OrderDate.ToString("MMM yyyy") into mg
select new { Month = mg.Key, Orders = mg }

Ваш результат будет

{25 января 2014 г.} {15 февраля 2015 г.} и т. д.

person Rolwin Crasta    schedule 18.11.2014
comment
Отлично работает для объектов, но не для IQueryable<>, которые будут отправлены в базу данных. Там вы получите Method 'System.String ToString(System.String)' has no supported translation to SQL. - person Thymine; 10.06.2019

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

Это основной синтаксис:

from o in yg
group o by o.OrderDate.Month into mg
select new { Month = mg.Key, Orders = mg }
person Jimmie R. Houts    schedule 18.04.2009
comment
При наличии списка, содержащего заказы за несколько лет, заказы за январь 2010, 2011 и 2012 годов будут объединены в одну группу. - person Moulde; 05.03.2012

Вот простое решение для группировки в DateTime.

List<leaveallview> lav = new List<leaveallview>();
lav = dbEntity.leaveallviews.Where(m =>m.created==alldate).ToList();
dynamic lav1 = lav.GroupBy(m=>m.created.Value.GetDateTimeFormats()).FirstOrDefault().ToList();
person belal ahmad    schedule 11.07.2017