/// <summary> /// Get timeseries on facility level /// </summary> public static List <TimeSeriesClasses.PollutantReleases> GetTimeSeries(int facilityid, string pollutantCode, MediumFilter.Medium medium) { DataClassesPollutantReleaseDataContext db = getDataContext(); //apply medium condition Expression <Func <POLLUTANTRELEASE, bool> > lambda = getLambdaExpression(medium); // get data and group by year (which get assigned to x.Key by link) IQueryable <IGrouping <int, POLLUTANTRELEASE> > group = db.POLLUTANTRELEASEs.Where(f => f.FacilityID == facilityid && f.PollutantCode == pollutantCode).Where(lambda).GroupBy(p => p.ReportingYear); // lookup medium IEnumerable <TimeSeriesClasses.PollutantReleases> data = null; switch (medium) { case MediumFilter.Medium.Air: data = group.Select(x => new TimeSeriesClasses.PollutantReleases(x.Key, x.Count(), x.Sum(p => p.QuantityAir), x.Sum(p => p.QuantityAccidentalAir))); break; case MediumFilter.Medium.Soil: data = group.Select(x => new TimeSeriesClasses.PollutantReleases(x.Key, x.Count(), x.Sum(p => p.QuantitySoil), x.Sum(p => p.QuantityAccidentalSoil))); break; case MediumFilter.Medium.Water: data = group.Select(x => new TimeSeriesClasses.PollutantReleases(x.Key, x.Count(), x.Sum(p => p.QuantityWater), x.Sum(p => p.QuantityAccidentalWater))); break; default: throw new ArgumentOutOfRangeException("medium", String.Format("Illegal medium: {0}", medium.ToString())); } return(data.OrderBy(p => p.Year).ToList()); }
public static Func <POLLUTANTRELEASE, double?> QuantityTotal(MediumFilter.Medium medium) { Expression <Func <POLLUTANTRELEASE, double?> > func; switch (medium) { case MediumFilter.Medium.Air: func = z => z.QuantityAir; break; case MediumFilter.Medium.Soil: func = z => z.QuantitySoil; break; case MediumFilter.Medium.Water: func = z => z.QuantityWater; break; default: throw new ArgumentOutOfRangeException("medium", String.Format("Illegal medium:{0}", medium.ToString())); } return(func.Compile()); }
//public static string CODE_TNE = EnumUtil.GetStringValue(QuantityUnit.Tonnes); // --------------------------------------------------------------------------------------------------- // Time series // --------------------------------------------------------------------------------------------------- #region timeseries /// <summary> /// Get timeseries on aggregated level /// </summary> public static List <TimeSeriesClasses.PollutantReleases> GetTimeSeries(PollutantReleasesTimeSeriesFilter filter, MediumFilter.Medium medium) { // apply filter Expression <Func <POLLUTANTRELEASE, bool> > lambda = getLambdaExpression(filter, medium); DataClassesPollutantReleaseDataContext db = getDataContext(); // get data and group by year (which get assigned to x.Key by link) IQueryable <IGrouping <int, POLLUTANTRELEASE> > group = db.POLLUTANTRELEASEs.Where(lambda).GroupBy(p => p.ReportingYear).OrderBy(p => p.Key); // lookup medium IEnumerable <TimeSeriesClasses.PollutantReleases> data = null; switch (medium) { case MediumFilter.Medium.Air: data = group.Select(x => new TimeSeriesClasses.PollutantReleases(x.Key, x.Count(), x.Sum(p => p.QuantityAir), x.Sum(p => p.QuantityAccidentalAir))); break; case MediumFilter.Medium.Soil: data = group.Select(x => new TimeSeriesClasses.PollutantReleases(x.Key, x.Count(), x.Sum(p => p.QuantitySoil), x.Sum(p => p.QuantityAccidentalSoil))); break; case MediumFilter.Medium.Water: data = group.Select(x => new TimeSeriesClasses.PollutantReleases(x.Key, x.Count(), x.Sum(p => p.QuantityWater), x.Sum(p => p.QuantityAccidentalWater))); break; default: throw new ArgumentOutOfRangeException("medium", String.Format("Illegal medium: {0}", medium.ToString())); } IEnumerable <Facility.ReportingCountries> years = Facility.GetReportingCountries(filter.AreaFilter).ToList(); IEnumerable <TimeSeriesClasses.PollutantReleases> res = from l in data.ToList() join r in years on l.Year equals r.Year select new TimeSeriesClasses.PollutantReleases(l.Year, l.Facilities, l.Quantity, l.QuantityAccidental, r.Countries); return(res.OrderBy(p => p.Year).ToList()); }