private void HandleStationsFromExisting(IList <List <HtmlNode> > rows, Train train, TrainInstance trainInstance) { if (trainInstance.Id != 0) { trainInstance?.TrainInstanceStations.Clear(); } DbContext.Entry(train).Collection(t => t.TrainStations).Query().Include(st => st.Station).Load(); Dictionary <string, TrainStation> trainStations = train.TrainStations.ToDictionary(st => st.Station.NormName, st => st); foreach (IList <HtmlNode> row in rows) { var(_, actualArrival) = Parsing.GetCellTimes(row[2]); var(_, actualDeparture) = Parsing.GetCellTimes(row[3]); var trainInstanceStation = new TrainInstanceStation { TrainInstance = trainInstance, TrainStation = trainStations[Station.NormalizeName(row[1].InnerText.Trim())], ActualArrival = actualArrival, ActualDeparture = actualDeparture }; trainInstance.TrainInstanceStations.Add(trainInstanceStation); } }
private void HandleStationsRecreate(IList <List <HtmlNode> > rows, Train train, TrainInstance trainInstance) { List <string> stationNames = new List <string>(); train.TrainStations.Clear(); trainInstance?.TrainInstanceStations.Clear(); foreach (IList <HtmlNode> row in rows) { string stationName = row[1].InnerText.Trim(); string normName = Station.NormalizeName(stationName); stationNames.Add(normName); var(arrival, actualArrival) = Parsing.GetCellTimes(row[2]); var(departure, actualDeparture) = Parsing.GetCellTimes(row[3]); var platform = row.Count == 5 ? row[4].InnerText.Trim() : null; var trainStation = new TrainStation { Train = train, Ordinal = train.TrainStations.Count, Station = new Station() { Name = stationName, NormName = normName }, Arrival = arrival, Departure = departure, Platform = string.IsNullOrEmpty(platform) ? null : platform }; train.TrainStations.Add(trainStation); if (trainInstance != null) { var trainInstanceStation = new TrainInstanceStation { TrainInstance = trainInstance, TrainStation = trainStation, ActualArrival = actualArrival, ActualDeparture = actualDeparture }; trainInstance.TrainInstanceStations.Add(trainInstanceStation); } } IDictionary <string, Station> stations = DbContext.Stations.Where(s => stationNames.Contains(s.NormName)).ToDictionary(s => s.NormName, s => s); foreach (TrainStation trainStation in train.TrainStations) { trainStation.Station = stations[trainStation.Station.NormName]; } var relativeDistances = GetRelativeDistances(train.TrainStations.Select(s => s.Station).ToList()); for (int i = 0; i < train.TrainStations.Count; i++) { train.TrainStations[i].RelativeDistance = relativeDistances[i]; } }