public void RecalculateConnections(int touristAttractionId) { var targetAttraction = context.TouristAttractions .Where(ta => ta.Id == touristAttractionId) .Select(ta => new { AttractionId = ta.Id, ta.Geoposition.Latitude, ta.Geoposition.Longitude, ta.CityId, ta.Active }).FirstOrDefault(); if (targetAttraction == null) { return; } //If it is active the matrix has to be recalculated if (targetAttraction.Active) { //lookup for the attractions that dont have a connection attached to the target attraction var attractionsForConnections = context.TouristAttractions .Where(ta => ta.Id != targetAttraction.AttractionId && ta.CityId == targetAttraction.CityId && ta.Active && !ta.OriginPositionDistances.Any(opd => opd.DestinationId == targetAttraction.AttractionId)) .Select(ta => new { AttractionId = ta.Id, ta.Geoposition.Latitude, ta.Geoposition.Longitude, }).ToList(); //Now there goes the distance calculation for each one //Calculating distances from targetAttraction as origin and the rest as destinations var targetAsDestinationConnections = attractionsForConnections .Select(a => new TouristAttractionConnection { CityId = targetAttraction.CityId, OriginId = a.AttractionId, DestinationId = targetAttraction.AttractionId, Distance = distanceCalculator.CalculateKmDistance(a.Latitude, a.Longitude, targetAttraction.Latitude, targetAttraction.Longitude) }); var targetAsOriginConnections = targetAsDestinationConnections .Select(c => new TouristAttractionConnection { CityId = targetAttraction.CityId, OriginId = c.DestinationId,//In the last dataset query the destination was the target attraction DestinationId = c.OriginId, Distance = c.Distance }); //Adding the connection same origin same destination var sameOriginSameDestinationConnection = new TouristAttractionConnection { CityId = targetAttraction.CityId, OriginId = targetAttraction.AttractionId, DestinationId = targetAttraction.AttractionId, Distance = 0.00 }; context.TouristAttractionConnections.Add(sameOriginSameDestinationConnection); context.TouristAttractionConnections.AddRange(targetAsDestinationConnections); context.TouristAttractionConnections.AddRange(targetAsOriginConnections); } else { //Here is the processing for the removal var connectionsToRemove = context.TouristAttractionConnections .Where(tac => tac.OriginId == targetAttraction.AttractionId || tac.DestinationId == targetAttraction.AttractionId) .ToList(); context.TouristAttractionConnections.RemoveRange(connectionsToRemove); } context.SaveChanges(); }