web-dev-qa-db-fra.com

LINQ: Grouper par mois et année dans un champ datetime

J'ai une table avec un champ datetime. Je souhaite récupérer un ensemble de résultats regroupés par la combinaison mois/année et le nombre d'enregistrements apparaissant au cours de ce mois/année. Comment cela peut-il être fait dans LINQ?

Le plus proche que j'ai pu comprendre est dans 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)

Mais je ne dirais pas que ça marche ...

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

Voici la liste des fonctions DateTime disponibles dans LINQ . Pour que cela fonctionne, vous devez également comprendre le regroupement de plusieurs colonnes

ordonné descendant

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

Ceci est destiné à ceux qui essaient d'accomplir la même chose mais en utilisant des expressions lambda.

En supposant que vous avez déjà une collection d'entités et que chaque entité a OrderDate comme l'une de ses propriétés.

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

Si vous n'avez pas besoin de la collection de SelectListItem, remplacez simplement la sélection par celle-ci:

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

vous pouvez aussi le faire de cette façon

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

Votre résultat sera

{Jan 2014, 25} {Février 2015, 15} etc ...

2
Rolwin C

Ce site a un exemple qui devrait répondre à vos besoins.

C'est la syntaxe de base:

from o in yg
group o by o.OrderDate.Month into mg
select new { Month = mg.Key, Orders = mg }
1
Jimmie R. Houts

Voici une solution simple pour le regroupement dans 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