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