2009-04-18 15 views
31

Ich habe eine Tabelle mit einem Datetime-Feld. Ich möchte eine Ergebnismenge abrufen, die nach der Kombination Monat/Jahr und der Anzahl der Datensätze in diesem Monat/Jahr gruppiert ist. Wie kann dies in LINQ getan werden?LINQ: Gruppieren nach Monat und Jahr in einem Datetime-Feld

Die nächstgelegene ich habe in der Lage ist, in T-SQL, um herauszufinden:

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) 

Aber ich würde nicht sagen, das funktioniert ...

Antwort

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

Hier ist die Liste der Datetime-Funktionen zur Verfügung, in LINQ. Dazu Sie arbeiten werde auch multi-column grouping

bestellt absteigend

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

Ich möchte dies nach Monaten sortieren wie ersten aktuellen Monat im oberen und vorherigen Monat nächsten und so weiter ?? Bitte helfen Sie –

+0

Sie können dies tun, indem Sie eine Bestellungbydescending hinzufügen – Jeremy

2

This Site hat ein Beispiel, das Ihre Notwendigkeit füllen sollte.

Dies ist die grundlegende Syntax:

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

Mit einer Liste, die Bestellungen aus mehreren Jahren enthält, gruppiert dies Bestellungen aus den Jahren 2010, 2011 und 2012 in die gleiche Gruppe. – Moulde

1

Sie könnte verstehen, müssen es auch tun, auf diese Weise

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

Ihr Ergebnis wird

{Januar 2014 sein , 25} {Feb 2015, 15} etc ...

7

Dies ist für diejenigen, die versuchen, dasselbe zu erreichen, aber Lambda-Ausdrücke verwenden.

Angenommen, Sie haben bereits eine Sammlung von Entitäten und jede Entität hat OrderDate als eine ihrer Eigenschaften.

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

Wenn Sie die Sammlung von SelectListItem nicht brauchen dann ersetzen Sie einfach den select mit dieser:

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

Hier ist eine einfache Lösung in Datetime für die Gruppierung.

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