2009-04-18 12 views
31

Mam tabelę z polem daty i godziny. Chcę pobrać zestaw wyników pogrupowany według kombinacji miesiąc/rok i liczbę rekordów wyświetlanych w tym miesiącu/roku. Jak to zrobić w LINQ?LINQ: Grupa według miesiąca i roku w polu datetime

Najbliżej byłem w stanie zorientować się w 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) 

Ale nie powiedziałbym, że działa ...

Odpowiedz

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() }; 

Oto lista funkcji DateTime dostępny w LINQ. Aby to działało będziesz także muszą zrozumieć multi-column grouping

uporządkowane malejąco

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

Chcę to posortować według miesięcy takich jak pierwszy bieżący miesiąc na górze i poprzedni miesiąc następny i tak? proszę pomóż –

+0

możesz to zrobić, dodając polecenie opóźnienia – Jeremy

2

This Site ma przykład, który powinien wypełnić swoje potrzeby.

To jest podstawowa składnia:

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

Z listą zawierającą zamówienia z wieloletnich lat, spowoduje to grupowanie zamówień od stycznia 2010, 2011 i 2012 do tej samej grupy. – Moulde

1

można też zrobić to w ten sposób

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

Twój wynik będzie

{styczeń 2014 , 25} {Feb 2015, 15} itd ...

7

To jest dla tych, którzy próbują osiągnąć to samo, ale używając wyrażeń lambda.

Zakładając, że już masz kolekcję podmiotów, a każda jednostka ma OrderDate jako jedną z jego właściwości.

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(); 

Jeśli nie potrzeba zbierania SelectListItem potem po prostu zastąpić select z tego:

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

Oto proste rozwiązanie do grupowania w 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();