Пример #1
0
        public async Task <IEnumerable <IWeatherData> > GetWeatherDataForDate(DateTime date)
        {
            using (var context = new EuropeWeatherEntities())
            {
                var weatherData =
                    await
                    context.WeatherData.Include(wde => wde.Cities)
                    .Where(
                        w =>
                        w.TimeOfCalculation.HasValue && w.TimeOfCalculation.Value.Year == date.Year &&
                        w.TimeOfCalculation.Value.Month == date.Month &&
                        w.TimeOfCalculation.Value.Day == date.Day)
                    .OrderBy(w => w.Cities.Countries.Name)
                    .ToListAsync();

                var mapper = new WeatherDataToWeatherDataDtoMapping(context);
                return(weatherData.Select(w => mapper.To(w)).ToList());
            }
        }
Пример #2
0
        public async Task <Tuple <IEnumerable <IWeatherData>, int> > GetLatestWeatherData(IEnumerable <int> cities = null,
                                                                                          TimeSpan?sunsetFrom      = null, TimeSpan?sunsetTo = null, TimeSpan?sunriseFrom = null,
                                                                                          TimeSpan?sunriseTo       = null, DateTime?from     = null, DateTime?to = null, int?minTemp = null,
                                                                                          int?maxTemp = null)
        {
            var url    = ConfigurationManager.AppSettings["api:url"];
            var apiKey = ConfigurationManager.AppSettings["api:key"];
            int refreshInterval;

            if (!int.TryParse(ConfigurationManager.AppSettings["api:interval"], out refreshInterval))
            {
                refreshInterval = 10;
            }
            using (var context = new EuropeWeatherEntities())
            {
                var latest = context.WeatherData.Max(w => w.Created);
                if (!latest.HasValue || (DateTime.UtcNow - latest.Value).TotalMinutes > refreshInterval)
                {
                    var sync = await ImportWeatherData(url, apiKey);

                    if (!sync)
                    {
                        //TODO: Log unsuccessfull sync
                    }
                }

                var filter = context.WeatherData.Include(w => w.Cities)
                             .GroupBy(w => w.CityId, w => w,
                                      (key, g) =>
                                      new
                {
                    CityId      = key,
                    WeatherData = g.OrderByDescending(w => w.Created).FirstOrDefault()
                })
                             .Select(r => r.WeatherData);
                var cityFilter = cities?.ToArray();
                if (cityFilter != null && cityFilter.Any())
                {
                    filter = filter.Where(w => cityFilter.Contains(w.CityId));
                }
                if (sunsetFrom.HasValue)
                {
                    filter =
                        filter.Where(
                            w =>
                            w.Sunset.HasValue && w.Sunset.Value.Hour >= sunsetFrom.Value.Hours &&
                            w.Sunset.Value.Minute >= sunsetFrom.Value.Minutes);
                }
                if (sunsetTo.HasValue)
                {
                    filter =
                        filter.Where(
                            w =>
                            w.Sunset.HasValue && w.Sunset.Value.Hour <= sunsetTo.Value.Hours &&
                            w.Sunset.Value.Minute <= sunsetTo.Value.Minutes);
                }
                if (sunriseFrom.HasValue)
                {
                    filter =
                        filter.Where(
                            w =>
                            w.Sunset.HasValue && w.Sunset.Value.Hour >= sunriseFrom.Value.Hours &&
                            w.Sunset.Value.Minute >= sunriseFrom.Value.Minutes);
                }
                if (sunriseTo.HasValue)
                {
                    filter =
                        filter.Where(
                            w =>
                            w.Sunset.HasValue && w.Sunset.Value.Hour <= sunriseTo.Value.Hours &&
                            w.Sunset.Value.Minute <= sunriseTo.Value.Minutes);
                }
                if (from.HasValue)
                {
                    filter = filter.Where(
                        w =>
                        w.TimeOfCalculation.HasValue && w.TimeOfCalculation.Value.Year >= from.Value.Year &&
                        w.TimeOfCalculation.Value.Month >= from.Value.Month &&
                        w.TimeOfCalculation.Value.Day >= from.Value.Day);
                }
                if (to.HasValue)
                {
                    filter = filter.Where(
                        w =>
                        w.TimeOfCalculation.HasValue && w.TimeOfCalculation.Value.Year <= to.Value.Year &&
                        w.TimeOfCalculation.Value.Month <= to.Value.Month &&
                        w.TimeOfCalculation.Value.Day <= to.Value.Day);
                }
                if (minTemp.HasValue)
                {
                    filter = filter.Where(w => w.Temperature.HasValue && w.Temperature.Value >= minTemp);
                }
                if (maxTemp.HasValue)
                {
                    filter = filter.Where(w => w.Temperature.HasValue && w.Temperature.Value <= maxTemp);
                }

                var count       = filter.Count();
                var weatherData = await filter.OrderBy(w => w.Cities.Countries.Name).Take(MAX_RESULTS).ToListAsync();

                var mapper = new WeatherDataToWeatherDataDtoMapping(context);
                return(new Tuple <IEnumerable <IWeatherData>, int>(weatherData.Select(w => mapper.To(w)).ToList(), count));
            }
        }
Пример #3
0
        public async Task <Tuple <IEnumerable <IWeatherData>, int> > SearchWeatherData(IEnumerable <int> cities = null,
                                                                                       TimeSpan?sunsetFrom      = null, TimeSpan?sunsetTo = null, TimeSpan?sunriseFrom = null,
                                                                                       TimeSpan?sunriseTo       = null, DateTime?from     = null, DateTime?to = null, int?minTemp = null,
                                                                                       int?maxTemp = null)
        {
            using (var context = new EuropeWeatherEntities())
            {
                var filter     = context.WeatherData.Include(wde => wde.Cities);
                var cityFilter = cities?.ToArray();
                if (cityFilter != null && cityFilter.Any())
                {
                    filter = filter.Where(w => cityFilter.Contains(w.CityId));
                }
                if (sunsetFrom.HasValue)
                {
                    filter =
                        filter.Where(
                            w =>
                            w.Sunset.HasValue && w.Sunset.Value.Hour >= sunsetFrom.Value.Hours &&
                            w.Sunset.Value.Minute >= sunsetFrom.Value.Minutes);
                }
                if (sunsetTo.HasValue)
                {
                    filter =
                        filter.Where(
                            w =>
                            w.Sunset.HasValue && w.Sunset.Value.Hour <= sunsetTo.Value.Hours &&
                            w.Sunset.Value.Minute <= sunsetTo.Value.Minutes);
                }
                if (sunriseFrom.HasValue)
                {
                    filter =
                        filter.Where(
                            w =>
                            w.Sunset.HasValue && w.Sunset.Value.Hour >= sunriseFrom.Value.Hours &&
                            w.Sunset.Value.Minute >= sunriseFrom.Value.Minutes);
                }
                if (sunriseTo.HasValue)
                {
                    filter =
                        filter.Where(
                            w =>
                            w.Sunset.HasValue && w.Sunset.Value.Hour <= sunriseTo.Value.Hours &&
                            w.Sunset.Value.Minute <= sunriseTo.Value.Minutes);
                }
                if (from.HasValue)
                {
                    filter = filter.Where(
                        w =>
                        w.TimeOfCalculation.HasValue && w.TimeOfCalculation.Value.Year >= from.Value.Year &&
                        w.TimeOfCalculation.Value.Month >= from.Value.Month &&
                        w.TimeOfCalculation.Value.Day >= from.Value.Day);
                }
                if (to.HasValue)
                {
                    filter = filter.Where(
                        w =>
                        w.TimeOfCalculation.HasValue && w.TimeOfCalculation.Value.Year <= to.Value.Year &&
                        w.TimeOfCalculation.Value.Month <= to.Value.Month &&
                        w.TimeOfCalculation.Value.Day <= to.Value.Day);
                }
                if (minTemp.HasValue)
                {
                    filter = filter.Where(w => w.Temperature.HasValue && w.Temperature.Value >= minTemp);
                }
                if (maxTemp.HasValue)
                {
                    filter = filter.Where(w => w.Temperature.HasValue && w.Temperature.Value <= maxTemp);
                }

                var count = filter.Count();

                var weatherData =
                    await
                    filter.OrderBy(w => w.Cities.Countries.Name)
                    .ThenByDescending(w => w.Created)
                    .Take(MAX_RESULTS)
                    .ToListAsync();

                var mapper = new WeatherDataToWeatherDataDtoMapping(context);
                return(new Tuple <IEnumerable <IWeatherData>, int>(weatherData.Select(w => mapper.To(w)).ToList(), count));
            }
        }