LINQ: Группировка по месяцам и годам в поле даты и времени
У меня есть таблица с полем datetime. Я хочу получить набор результатов, сгруппированный по сочетанию месяц/год, и количество записей, которые появляются в течение этого месяца/года. Как это можно сделать в 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)
Но я бы не сказал, что работает...
Ответы
Ответ 1
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);
Ответ 2
Это для тех, кто пытается выполнить то же самое, но используя лямбда-выражения.
Предполагая, что у вас уже есть набор сущностей, и каждый объект имеет 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()))
Ответ 3
На этом сайте приведен пример, который должен заполнить ваши потребности.
Это основной синтаксис:
from o in yg
group o by o.OrderDate.Month into mg
select new { Month = mg.Key, Orders = mg }
Ответ 4
вы также можете сделать это таким образом
from o in yg
group o by o.OrderDate.ToString("MMM yyyy") into mg
select new { Month = mg.Key, Orders = mg }
Ваш результат будет
{январь 2014, 25}
{Feb 2015, 15} и т.д.
Ответ 5
Вот простое решение для группировки в 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();