2009-04-18 3 views
31

У меня есть таблица с полем даты и времени. Я хочу получить набор результатов, сгруппированный по сочетанию месяц/год, и количество записей, которые появляются в течение этого месяца/года. Как это можно сделать в 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) 

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

ответ

59
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. Для этой работы вам также необходимо понять multi-column grouping

упорядоченные по убыванию

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); 
+0

Я хочу сортировать это по месяцам, как первый текущий месяц наверху и предыдущий месяц следующий и так далее? помогите –

+0

, вы можете сделать это, добавив orderbydescending – Jeremy

2

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

Это базовый синтаксис:

from o in yg 
group o by o.OrderDate.Month into mg 
select new { Month = mg.Key, Orders = mg } 
+6

Со списком, содержащим заказы от mulitple years, это будет группировать заказы с января 2010, 2011 и 2012 годов в ту же группу. – Moulde

1

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

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} и т. Д.

7

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

Предполагая, что у вас уже есть коллекция сущностей, и каждая сущность имеет 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())) 
0

Вот простое решение для группировки в 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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^