public static void CalculateDistance() { var math = new MathHelper(); using (var context = new SmartBuyEntities()) { var markets = context.Markets.Where(x => x.IsActive).ToList(); for (int i = 0; i < markets.Count - 1; i++) { double lat1 = markets[i].Latitude.Value; double lng1 = markets[i].Longitude.Value; for (int j = i + 1; j < markets.Count; j++) { if (markets[j].Latitude == null || markets[j].Longitude == null) { continue; } double lat2 = markets[j].Latitude.Value; double lng2 = markets[j].Longitude.Value; double distance = math.CalculateDistance(lat1, lng1, lat2, lng2); int fromId = markets[i].Id; int toId = markets[j].Id; var mDis = context.MarketDistances .FirstOrDefault(x => x.FromMarket == fromId && x.ToMarket == toId); if (mDis == null) { var dis = new MarketDistance { FromMarket = markets[i].Id, ToMarket = markets[j].Id, Distance = distance }; context.MarketDistances.Add(dis); } } } context.SaveChanges(); } }
public static void CalculateDistance() { var model = DistanceConfigHelper.GetData(); if (model.Status == (int)DistanceStatus.Finish) { return; } int i = model.From; int j = model.To; var math = new MathHelper(); using (var context = new SmartBuyEntities()) { var markets = context.Markets .Where(x => x.IsActive && x.Latitude != null && x.Longitude != null) .ToList(); while (true) { var lat1 = markets[i].Latitude.Value; var lng1 = markets[i].Longitude.Value; var lat2 = markets[j].Latitude.Value; var lng2 = markets[j].Longitude.Value; var distance = math.TravelDistance(lat1, lng1, lat2, lng2); // OK if (distance != -1) { var m1 = markets[i]; var m2 = markets[j]; var tmp = context.MarketDistances .FirstOrDefault(x => x.FromMarket == m1.Id && x.ToMarket == m2.Id); if (tmp != null) { tmp.Distance = distance; } else { var mDistance = new MarketDistance { FromMarket = markets[i].Id, ToMarket = markets[j].Id, Distance = distance }; context.MarketDistances.Add(mDistance); } j++; if (j == markets.Count) { i++; // Finish if (i == markets.Count - 1) { DistanceConfigHelper.Finish(); context.SaveChanges(); return; } j = i + 1; } } else { // Something's wrong, out of quota var savePoint = new DistanceConfigModel { From = i, To = j, Status = (int) DistanceStatus.Going }; // Save DistanceConfigHelper.SetData(savePoint); context.SaveChanges(); return; } } } }