2009-04-18 31 views
31

Tengo una tabla con un campo de fecha y hora. Quiero recuperar un conjunto de resultados agrupados por la combinación mes/año y la cantidad de registros que aparecen dentro de ese mes/año. ¿Cómo se puede hacer esto en LINQ?LINQ: Agrupar por mes y año dentro de un campo de fecha y hora

Lo más cerca que he podido averiguar es en 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) 

Pero yo no diría que funciona ...

Respuesta

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

Aquí está la lista de las funciones disponibles en DateTime LINQ. Para que esto funcione, también tendrá que entender multi-column grouping

ordenado descendente

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

quiero ordenar esto por meses como el primer mes actual en la parte superior y el mes anterior siguiente y así sucesivamente ?? por favor ayuda –

+0

puede hacer eso agregando un orden por descendido – Jeremy

2

This Site tiene un ejemplo que debe llenar su necesidad.

Ésta es la sintaxis básica:

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

Con una lista que contiene pedidos de varios años, esto agrupará las órdenes de enero de 2010, 2011 y 2012 en el mismo grupo. – Moulde

1

también podría hacerlo de esta manera

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

Su resultado será

{Ene 2014 , 25} {feb 2015, 15} etc ...

7

Esto es para aquellos que están intentando lograr lo mismo pero usando expresiones lambda.

Suponiendo que ya tiene una colección de entidades y cada entidad tiene OrderDate como una de sus propiedades.

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 usted no necesita la colección de SelectListItem continuación, basta con sustituir el selecto con éste:

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

Aquí es una solución simple para agrupar en 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(); 
Cuestiones relacionadas