public async Task <IEnumerable <ProgramUsageSummary> > GetProgramUsagesSummary(List <Program> programs) { List <ProgramUsageSummary> returnData = new List <ProgramUsageSummary>(); DataSet set = await this.ExecuteStoredProcedure(StoredProcedureNames.p_GetProgramUsagesSummary , new SqlParameter("programIds", SqlDbType.NVarChar, 500) { Value = string.Join(",", programs.Select(x => x.Id)) } ).ConfigureAwait(false); List <DataRow> eventsRows = set.Tables[0].AsEnumerable().ToList(); List <DataRow> viewsRows = set.Tables[1].AsEnumerable().ToList(); foreach (Program program in programs) { ProgramUsageSummary usageSummary; try { DataRow programEventSummary = eventsRows.FirstOrDefault(x => (int)x["ProgramId"] == program.Id); DataRow programViewSummary = viewsRows.FirstOrDefault(x => (int)x["ProgramId"] == program.Id); usageSummary = new ProgramUsageSummary { ProgramName = program.Name , EventsCount = (int)(programEventSummary?["Types"] ?? 0) , ViewsCount = (int)(programViewSummary?["Types"] ?? 0) , TotalViewsUsageCount = (int)(programViewSummary?["Total"] ?? 0) , TotalTodayViewsUsageCount = (int)(programViewSummary?["Todays"] ?? 0) , TotalEventsUsageCount = (int)(programEventSummary?["Total"] ?? 0) , TotalTodayEventsUsageCount = (int)(programEventSummary?["Todays"] ?? 0) }; DateTimeOffset lastView = (DateTimeOffset)(programViewSummary?["Last"] ?? default(DateTimeOffset)); DateTimeOffset lastEvent = (DateTimeOffset)(programEventSummary?["Last"] ?? default(DateTimeOffset)); usageSummary.LastUsage = lastEvent; if (lastView > lastEvent) { usageSummary.LastUsage = lastView; } } catch (Exception) { usageSummary = new ProgramUsageSummary(); usageSummary.ProgramName = program?.Name ?? "Error while loading summary"; } returnData.Add(usageSummary); } return(returnData); }
public async Task <IEnumerable <ProgramUsageSummary> > GetProgramUsagesSummary(List <Program> programs) { List <ProgramUsageSummary> returnData = new List <ProgramUsageSummary>(); foreach (Program program in programs) { ProgramUsageSummary usageSummary; try { List <View> views = await this.Views.FindAsync(x => x.ProgramId == program.Id).ConfigureAwait(false); List <ViewTelemetrySummary> viewSummaries = views.SelectMany(x => x.TelemetrySummaries).ToList(); List <Event> events = await this.Events.FindAsync(x => x.ProgramId == program.Id).ConfigureAwait(false); List <EventTelemetrySummary> eventSummaries = events.SelectMany(x => x.TelemetrySummaries).ToList(); List <TelemetrySummary> allSummaries = viewSummaries.Cast <TelemetrySummary>().Concat(eventSummaries).ToList(); usageSummary = new ProgramUsageSummary { ProgramName = program.Name , LastUsage = allSummaries.MaxOrNull(x => x.LastTelemetryUpdateTimestamp) , TodayUsageCount = allSummaries.Where(x => (DateTime.UtcNow - x.LastTelemetryUpdateTimestamp).TotalHours <= 24).Sum(smr => smr.GetTelemetryDetails().Count(detail => (DateTime.UtcNow - detail.Timestamp).TotalHours <= 24)) , TotalUsageCount = allSummaries.Sum(x => x.SummaryCount) , ViewsCount = views.Count , TotalViewsUsageCount = viewSummaries.Sum(s => s.SummaryCount) , TotalTodayViewsUsageCount = viewSummaries.Where(x => (DateTime.UtcNow - x.LastTelemetryUpdateTimestamp).TotalHours <= 24).Sum(smr => smr.TelemetryDetails.Count(detail => (DateTime.UtcNow - detail.Timestamp).TotalHours <= 24)) , EventsCount = events.Count , TotalEventsUsageCount = eventSummaries.Sum(x => x.SummaryCount) , TotalTodayEventsUsageCount = eventSummaries.Where(x => (DateTime.UtcNow - x.LastTelemetryUpdateTimestamp).TotalHours <= 24).Sum(smr => smr.TelemetryDetails.Count(detail => (DateTime.UtcNow - detail.Timestamp).TotalHours <= 24)) }; } catch (Exception) { usageSummary = new ProgramUsageSummary(); usageSummary.ProgramName = program?.Name ?? "Error while loading summary"; } returnData.Add(usageSummary); } return(returnData); }