private static Task <IEnumerable <Measurement> > GetFittedMeasurements(
            DataConnection Connection, int SensorId, DateTime StartTime, DateTime EndTime,
            int MaxMeasurementCount)
        {
            if (EndTime < StartTime)
            {
                throw new ArgumentException($"{nameof(StartTime)} was greater than {nameof(EndTime)}");
            }

            var timeSpan = EndTime - StartTime;

            if (timeSpan.TotalMinutes <= MaxMeasurementCount)
            {
                // Assume that one measurement was made per minute.
                // This assumption may not _always_ prove to be correct,
                // but we'd like to keep database chatter to a minimum.
                return(Connection.GetMeasurementsAsync(SensorId, StartTime, EndTime));
            }
            else if (timeSpan.TotalHours <= MaxMeasurementCount)
            {
                return(Connection.GetHourAveragesAsync(
                           SensorId, MeasurementAggregation.Quantize(StartTime, TimeSpan.FromHours(1)),
                           (int)Math.Round(timeSpan.TotalHours)));
            }
            else if (timeSpan.TotalDays <= MaxMeasurementCount)
            {
                return(Connection.GetDayAveragesAsync(
                           SensorId, MeasurementAggregation.Quantize(StartTime, TimeSpan.FromDays(1)),
                           (int)Math.Round(timeSpan.TotalDays)));
            }
            else
            {
                int yearCount  = EndTime.Year - StartTime.Year;
                int monthCount = 12 * yearCount + EndTime.Month - StartTime.Month;
                if (monthCount <= MaxMeasurementCount)
                {
                    return(Connection.GetMonthAveragesAsync(
                               SensorId, MeasurementAggregation.QuantizeMonth(StartTime), monthCount));
                }
                else
                {
                    return(Connection.GetYearAveragesAsync(
                               SensorId, MeasurementAggregation.QuantizeYear(StartTime), yearCount));
                }
            }
        }
 /// <summary>
 /// Quantizes the given date-time.
 /// </summary>
 public override DateTime Quantize(DateTime Time)
 {
     return(MeasurementAggregation.QuantizeYear(Time));
 }