public async Task <IReadOnlyCollection <ReadingVm> > GetReadingsAsync(ReadingQuery args) { var query = _dbContext .Readings .Where(r => r.BuildingId == args.BuildingId && r.ObjectId == args.ObjectId && r.DataFieldId == args.DataFieldId); var requiredReadings = await query .Where(r => r.Timestamp >= args.FromDate && r.Timestamp <= args.ToDate) .OrderBy(b => b.Timestamp) .ProjectTo <ReadingVm>(_mapper.ConfigurationProvider) .ToListAsync(); if (!requiredReadings.Any()) { return(new List <ReadingVm>()); } var lastRow = await query .OrderByDescending(r => r.Timestamp) .ProjectTo <ReadingVm>(_mapper.ConfigurationProvider) .FirstOrDefaultAsync(); var requiredLastReadingsRow = requiredReadings.LastOrDefault(); if (!(lastRow.Timestamp == requiredLastReadingsRow.Timestamp && lastRow.Value == requiredLastReadingsRow.Value)) { requiredReadings.Add(lastRow); } return(requiredReadings); }
public async Task <IActionResult> GetReadings([FromQuery] ReadingQuery args) { var readings = await _mediator.Send(args); if (!readings.Any()) { return(NoContent()); } return(Ok(readings)); }
public async Task <IReadOnlyCollection <ReadingVm> > Handle(ReadingQuery args, CancellationToken cancellationToken) { args.ToDate = args.ToDate.ToEndOfTheDate(); var cacheKey = $"reading-{args.BuildingId}-{args.ObjectId}-{args.DataFieldId}-{args.FromDate}-{args.ToDate}"; var readingsFromCache = await _distributedCache .GetCacheAsync <IReadOnlyCollection <ReadingVm> >(cacheKey); if (readingsFromCache != null) { return(readingsFromCache); } var readingsFromDb = await _readingService .GetReadingsAsync(args); await _distributedCache .SetCacheAsStringAsync(cacheKey, readingsFromDb, 30); return(readingsFromDb); }