Для EF Core 2.1 и выше:
Установите:
dotnet add package Microsoft.EntityFrameworkCore.Proxies --version 2.2.4
Затем обновите файл Startup.cs, как указано ниже.
using Microsoft.EntityFrameworkCore.Proxies;
services.AddEntityFrameworkProxies();
services.AddDbContext<BlogDbContext>(options =>
{
options.UseSqlite(Configuration.GetSection("ConnectionStrings")["DefaultConnection"]);
options.UseLazyLoadingProxies(true);
});
MySQL Great Circle Distance (формула Хаверсина) делает именно то, что вам нужно.
Однако, имея всего 200 записей, вы можете просто загрузить их все и проверить с помощью кода. Набор данных действительно слишком мал, чтобы слишком беспокоиться о базе данных по сравнению с кодом или любой другой подобной оптимизации.
Вычисление расстояния между почтовыми индексами в PHP имеет несколько PHP-реализаций этого алгоритма.
Geo Proximity Search - это почти та же проблема, что и у вас.
MySQL имеет возможность индексировать строки географически. Возможно, вам не придется делать это самостоятельно (вы можете просто попросить MySQL вычислить расстояние между двумя геообъектами и отсортировать по нему ..).
Для этого доступны функции MySQL.
http://dev.mysql.com/doc/refman/5.0/en/gis-introduction.html
Может быть, что-то вроде
SELECT field1, field2, ...,
ACOS(SIN(latitude / 180 * PI()) * SIN(:1) + COS(latitude / 180 * PI()) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
ORDER BY distance ASC;
или
SELECT field1, field2, ...,
ACOS(SIN(RADIANS(latitude)) * SIN(:1) + COS(RADIANS(latitude)) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
ORDER BY distance ASC;
(напрямую переведено из кода PHP)
: 1
и : 2
равно $ lat2 / 180 * pi ()
и $ long2 / 180 * pi ()
соответственно.
Это формула Хаверсина. Вы можете перевести PHP непосредственно в SQL, чтобы вы могли пространственно запрашивать базу данных (альтернативой является извлечение каждой записи из базы данных и прогон данных через PHP). MySQL предоставляет все необходимые математические функции.
Я сделал это для коммерческого веб-сайта, который предоставлял поиск расстояний на основе почтовых / почтовых индексов, так что это, безусловно, возможно без специальных функций ГИС.
Почему бы вам не использовать геопространственные функции MySQL ...? Нет, шучу.
Если 200 записей представляют собой реальные места, такие как города и т. Д., То можно ли в качестве альтернативы использовать API GeoNames?
Следующий веб-сервис предоставит 10 ближайших местоположений к предоставленным широте и долготе:
http://ws.geonames.org/findNearby?lat=47.3&lng=9
Источник: http://www.geonames.org/export/web-services.html#findNearbyPlaceName
Полный список: http://www.geonames.org/export/ws-overview.html