Agrupando por cada n minutos.

Estoy jugando con LINQ y me preguntaba qué tan fácil sería agrupar por minutos, pero en lugar de tener cada minuto, me gustaría agrupar por cada 5 minutos.

Por ejemplo, actualmente tengo:

var q = (from cr in JK_ChallengeResponses where cr.Challenge_id == 114 group cr.Challenge_id by new { cr.Updated_date.Date, cr.Updated_date.Hour, cr.Updated_date.Minute } into g select new { Day = new DateTime(g.Key.Date.Year, g.Key.Date.Month, g.Key.Date.Day, g.Key.Hour, g.Key.Minute, 0), Total = g.Count() }).OrderBy(x => x.Day); 

introduzca la descripción de la imagen aquí

¿Qué tengo que hacer para agrupar mi resultado por cada 5 minutos ?

Para agrupar por n de algo, puede usar la siguiente fórmula para crear “cubos”:

 ((int)(total / bucket_size)) * bucket_size 

Esto tomará el total, lo dividirá, lo convertirá en entero para dejar caer decimales y luego se multiplicará nuevamente, lo que terminará con múltiplos de bucket_size de bucket_size . Entonces, por ejemplo ( / es división entera, por lo que no es necesario lanzar):

 group cr.Challenge_id by new { cr.Updated_Date.Year, cr.Updated_Date.Month, cr.Updated_Date.Day, cr.Updated_Date.Hour, Minute = (cr.Updated_Date.Minute / 5) * 5 } 

// Los datos vienen por cada 3 horas.

donde (Convert.ToDateTime (capcityprogressrow [“Data Captured Date”]. ToString ()) Date! = DateTime.Now.Date || (Convert.ToDateTime (capcityprogressrow [“Data Captured Date”]. ToString ()). Date == DateTime.Now.Date && (Convert.ToInt16 (capcityprogressrow [“Data Captured Time”)))% 3 == 0)) agrupa capcityprogressrow por nuevo {WCGID = Convert.ToIntt32 (Conversions.GetIntEntityValue (“WCGID”, capcityprogressress )), WCGName = Conversions.GetEntityValue (“WIRECENTERGROUPNAME”, capcityprogressrow) .ToString (), DueDate = Convert.ToDateTime (capcityprogressrow [“Data Captured Date”)), DueTime = capcityprogressrow […] } en WCGDateGroup

// Para pedidos con un pedido pendiente

 .OrderBy(x => x.WcgName).ThenBy(x => x.DataCapturedDateTime).ThenBy(x => x.DataCapturedTime).ToList();