public static DateTime TruncatedBy(this DateTime date, TimeRangeAggregationTypes truncateSize) { switch (truncateSize) { case TimeRangeAggregationTypes.Hourly: return(date.TruncatedHourly()); case TimeRangeAggregationTypes.Daily: default: return(date.TruncatedDaily()); } }
public static async Task <DataItem[]> GetAggregatedStats(ActionType actionType, DateTime?dateFrom = null, DateTime?dateTo = null, TimeRangeAggregationTypes truncateSize = TimeRangeAggregationTypes.Hourly) { var statsQuery = _dbContext.Stats .AsNoTracking() .Where(x => x.ActionType == actionType); if (dateFrom.HasValue) { statsQuery = statsQuery.Where(x => x.DateTime >= dateFrom); } if (dateTo.HasValue) { statsQuery = statsQuery.Where(x => x.DateTime < dateTo); } var stats = await statsQuery.ToListAsync(); var aggregatedStats = stats .GroupBy(x => x.DateTime.TruncatedBy(truncateSize)) .Select(x => new DataItem { Date = x.First().DateTime, Count = x.Count() }) .ToArray(); return(aggregatedStats); }