У меня есть страница, где я показываю компании, которые находятся в пределах определенного количества миль от пользователя. Я храню широту и долготу пользователя и бизнеса в базе данных. В настоящее время я использую NHibernate для возврата всех предприятий в базе данных, затем проверяю каждое предприятие, чтобы определить, находится ли его широта / долгота в пределах X миль от пользователя, затем создаю новый список только предприятий в этом радиусе и возвращаю их.
public static List<Business> FindNearbyBusinesses(Coordinates coordinates, int radiusInMiles)
{//TODO: figure out better way to do this performance-wise!
//get all businesses.
var criteria = DetachedCriteria.For<Core.Models.Business>();
var businesses = FindAll(criteria);
//find nearby businesses.
var nearbyBusinesses = new List<Business>();
foreach (var business in businesses)
{
business.MilesToLocation = GeoHelper.GetDistanceBetweenCoordinates(coordinates, business.Coordinates);
if (business.MilesToLocation <= radiusInMiles)
{
nearbyBusinesses.Add(business);
}
}
//sort.
nearbyBusinesses.Sort(delegate(Business b1, Business b2)
{
return b1.MilesToLocation.CompareTo(b2.MilesToLocation);
});
return nearbyBusinesses;
}
Это, конечно, ужасно неэффективно и плохо масштабируется, если в базе данных есть десятки или сотни тысяч предприятий. Есть ли способ, которым я могу сделать это лучше, чтобы мне не нужно было сначала возвращать каждую отдельную компанию в базу данных и выполнять этот расчет расстояния для каждой отдельной компании? Одна мысль, которая у меня возникла, была, может быть, есть способ сказать, что если радиус равен определенному количеству миль, то широта / долгота должны быть в этом диапазоне, а затем выполнить калькуляцию только для них.
Спасибо за любые предложения,
Justin