Я пытаюсь вычислить расстояние между текущей точкой пользователя и другой точкой в базе данных. Я написал следующий код, но получаю ошибку function st_x(geography) does not exist
.
var pointsQueryable = _context.Points;
var points = pointsQueryable.Select(x => new PointViewModel
{
Id = x.Id,
Title = x.Title,
Address = x.Address,
Description = x.Description,
Longitude = x.Location.X,
Latitude = x.Location.Y,
Image = x.Image,
DistanceFromUser = x.Location.Distance(new Point(filter.UserLongitude, filter.UserLatitude)),
});
Конечно, я уже включил Postgis для базы данных с помощью команды CREATE EXTENSION postgis;
.
Я протестировал данный сценарий в аналогичном проекте со следующим примером кода, и он работает:
var firstPoint = new Point(10, 20);
var fooPoint = await _fooRepository.FirstOrDefaultAsync(p=>p.Geom.Distance(firstPoint) > 5);
var distance = fooPoint.Geom.Distance(firstPoint);
Но в моем случае поле Geom объекта определяется как «Геометрия». Можете ли вы также предоставить свой класс сущности, чтобы вопрос был более ясным.
Если в проекте используется NetTopologySuit
, может помочь следующая конфигурация.
var builder = new DbContextOptionsBuilder<FooDbContext>()
.UseNpgsql(configuration.GetConnectionString("Default"),
opts => { opts.UseNetTopologySuite(); });
Спасибо, я выполнил настройки program.cs и все остальное, воспользовался многими решениями, но все равно получаю эту ошибку. Это мое поле: `` [Column(TypeName = "география (точка)")] public PointLocation {get; набор; } = новая точка(новая координата());``
Функции ST_X/ST_Y определены только для типа геометрии, поэтому вместо использования географии попробуйте использовать тип геометрии.
Пожалуйста, укажите тип
pointsQueryable
и тип результатаPaging(pager)
.