Example #1
0
        public IList <MeterReading> GetAggregatedMeterReadings(EpicMetersAggregateBy aggregateBy)
        {
            if (this.MeterReadings == null)
            {
                return(null);
            }
            List <MeterReading> meterReadings = new List <MeterReading>();

            switch (aggregateBy)
            {
            // Hour is everything... not relevant
            //case EpicMetersAggregateBy.Hour:
            //    meterReadings.AddRange(this.MeterReadings);
            //    break;
            case EpicMetersAggregateBy.Day:
                var readings = from mr in this.MeterReadings
                               group mr by mr.ChannelNumber into cg
                               select new
                {
                    Channel  = cg.Key,
                    Readings = from r in cg
                               group r by r.ReadingDate.Day into mrg
                               select new MeterReading(cg.Key, mrg.First().ReadingDate, mrg.Sum(mr => mr.Value))
                };
                foreach (var group in readings)
                {
                    meterReadings.AddRange(group.Readings);
                }

                break;

            case EpicMetersAggregateBy.Month:
                readings = from mr in this.MeterReadings
                           group mr by mr.ChannelNumber into cg
                           select new
                {
                    Channel  = cg.Key,
                    Readings = from r in cg
                               group r by r.ReadingDate.Month into mrg
                               select new MeterReading(cg.Key, mrg.First().ReadingDate, mrg.Sum(mr => mr.Value))
                };
                foreach (var group in readings)
                {
                    meterReadings.AddRange(group.Readings);
                }
                break;

            case EpicMetersAggregateBy.Year:
                readings = from mr in this.MeterReadings
                           group mr by mr.ChannelNumber into cg
                           select new
                {
                    Channel  = cg.Key,
                    Readings = from r in cg
                               group r by r.ReadingDate.Year into mrg
                               select new MeterReading(cg.Key, mrg.First().ReadingDate, mrg.Sum(mr => mr.Value))
                };
                foreach (var group in readings)
                {
                    meterReadings.AddRange(group.Readings);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException("AggregateColumn property must be set to aggregate meter readings");
            }
            return(meterReadings);
        }
Example #2
0
        public IList <MeterReading> GetPeakMeterReadings(EpicMetersAggregateBy aggregateBy)
        {
            if (this.MeterReadings == null)
            {
                return(null);
            }
            List <MeterReading> meterReadings = new List <MeterReading>();

            switch (aggregateBy)
            {
            case EpicMetersAggregateBy.Day:
                var readings = from mr in this.MeterReadings
                               group mr by mr.ChannelNumber into cg
                               select new
                {
                    Channel  = cg.Key,
                    Readings = from r in cg
                               group r by r.ReadingDate.Day into mrg
                               select new MeterReading(mrg.OrderByDescending(mr => mr.Value).First())
                };
                foreach (var group in readings)
                {
                    meterReadings.AddRange(group.Readings);
                }
                break;

            case EpicMetersAggregateBy.Month:
                readings = from mr in this.MeterReadings
                           group mr by mr.ChannelNumber into cg
                           select new
                {
                    Channel  = cg.Key,
                    Readings = from r in cg
                               group r by r.ReadingDate.Month into mrg
                               //select new MeterReading(cg.Key, mrg.First().ReadingDate, mrg.Max(mr => mr.Value))
                               select new MeterReading(mrg.OrderByDescending(mr => mr.Value).First())
                };
                foreach (var group in readings)
                {
                    meterReadings.AddRange(group.Readings);
                }
                break;

            case EpicMetersAggregateBy.Year:
                readings = from mr in this.MeterReadings
                           group mr by mr.ChannelNumber into cg
                           select new
                {
                    Channel  = cg.Key,
                    Readings = from r in cg
                               group r by r.ReadingDate.Year into mrg
                               //select new MeterReading(cg.Key, mrg.First().ReadingDate, mrg.Max(mr => mr.Value))
                               select new MeterReading(mrg.OrderByDescending(mr => mr.Value).First())
                };
                foreach (var group in readings)
                {
                    meterReadings.AddRange(group.Readings);
                }
                break;
            }

            return(meterReadings);
        }