web-dev-qa-db-de.com

LINQ: Gruppiert nach Monat und Jahr in einem Datumszeitfeld

Ich habe eine Tabelle mit einem Datumsfeld. Ich möchte eine Ergebnismenge abrufen, die nach der Monat/Jahr-Kombination und der Anzahl der Datensätze gruppiert ist, die innerhalb dieses Monats/Jahres erscheinen. Wie kann das in LINQ gemacht werden?

Das nächste, was ich herausfinden konnte, ist in 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)

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

37
tsilb
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 in LINQ . Damit dies funktioniert, müssen Sie auch mehrspaltige Gruppierung verstehen.

absteigend geordnet

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);
66
Jeremy

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

Angenommen, Sie verfügen bereits über eine Sammlung von Entitäten, und für jede Entität ist OrderDate 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 Auflistung von SelectListItem nicht benötigen, ersetzen Sie einfach die Auswahl durch diese:

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

sie könnten es auch so machen

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

Ihr Ergebnis wird sein

{Januar 2014, 25} {Feb 2015, 15} usw.

2
Rolwin C

Diese Site hat ein Beispiel, das Ihre Bedürfnisse erfü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 }
1
Jimmie R. Houts

Hier ist eine einfache Lösung zum Gruppieren in 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();
0
belal ahmad