public static WeatherLocatioinModel LoadLocationWeatherData(DateTime now, Location location, WeatherData[] locationData)
        {
            var minDate = now.AddMinutes(-90);
            var maxDate = now.AddMinutes(90);

            // погода на текущее время
            var current = locationData.FirstOrDefault(d => d.Date > minDate && d.Date <= maxDate);

            // погода на ближайшие сутки
            var xxx = current != null ? current.Date : now;
            var day = locationData
                        .Where(d => d.Date > xxx && d.Date <= xxx.AddDays(1))
                        .Where(FilterByHours)
                        .OrderBy(d => d.Date)
                        .Take(3)
                        .ToArray();

            // прогноз на несколько дней
            var forecast = locationData
                        .Where(d => d.Date.Date > now.Date)
                        .GroupBy(d => d.Date.Date)
                        .Take(3);

            return new WeatherLocatioinModel
            {
                LocationId = location.Id,
                LocationName = location.DisplayName,
                Now = CreateNowModel(current),
                Today = day.Select(CreateNowModel).ToArray(),
                Forecast = forecast.Select(CreateDayModel).ToArray()
            };
        }
 private static WeatherNowDataModel CreateNowModel(WeatherData obj)
 {
     return obj == null
         ? null
         : new WeatherNowDataModel
         {
             DateTime = obj.Date,
             Code = obj.WeatherCode,
             Description = obj.WeatherDescription,
             Temperature = Convert.ToInt32(obj.Temperature),
             Pressure = Convert.ToInt32(obj.Pressure),
             Humidity = obj.Humidity,
         };
 }
 private static bool FilterByHours(WeatherData data)
 {
     return data != null && (
         data.Date.Hour == 3 ||
         data.Date.Hour == 9 ||
         data.Date.Hour == 15 ||
         data.Date.Hour == 21);
 }
        private static void PopulateWeatherDataItem(WeatherData dataItem, dynamic item)
        {
            dataItem.Temperature = item.main.temp;
            dataItem.Cloudiness = item.clouds.all;
            dataItem.Humidity = item.main.humidity;
            dataItem.Pressure = item.main.pressure;
            dataItem.WindDirection = item.wind.deg;
            dataItem.WindSpeed = item.wind.speed;

            if (item.weather != null && item.weather.First != null)
            {
                dynamic w = item.weather.First;

                dataItem.WeatherDescription = w.description;
                dataItem.WeatherCode = w.icon;
            }
            else
                dataItem.WeatherCode = dataItem.WeatherDescription = null;
        }
        private static WeatherData GetWeatherDataItem(Location location, DateTime date, ISession session)
        {
            var dataItem = session.Query<WeatherData>().FirstOrDefault(obj => obj.Date == date && obj.Location.Id == location.Id);
            if (dataItem == null)
            {
                dataItem = new WeatherData { Id = Guid.NewGuid(), Date = date, Location = location };
                session.Save(dataItem);
            }

            return dataItem;
        }