EF.Functions.Distance с конвертором внутри
мне нужно конвертировать
public record GeoPoint(double Latitude, double Longitude);
в NetTopologySuite т.к. в сущности я не могу использовать напрямую зависимости
в переводе в sql происходит ошибка
.Where(p => p.Name == __8__locals1_pointDto_Name_0 || p.PointTypeId == __8__locals1_pointDto_PointTypeId_1 || __Functions_2\r\n .Distance(\r\n geometry: GeoPointConverter.ToProvider(p.Coordinates), \r\n anotherGeometry: __coord_3, \r\n useSpheroid: True) < 0,0001)' could not be translated.
сам код с ошибкой
var existingPoints = await FindAsync(p =>
p.Name == pointDto.Name ||
(
p.PointTypeId == pointDto.PointTypeId &&
EF.Functions.Distance(
Location.GeoPointConverter.ToProvider(p.Coordinates),
coord, true) < 0.0001d)
);
реализация поиска
public async Task<IEnumerable<T>> FindAsync(
Expression<Func<T, bool>> predicate,
params Expression<Func<T, object>>[] includes)
{
var query = _dbSet.Where(predicate);
foreach (var include in includes)
query = query.Include(include);
return await query.ToListAsync();
}
конвертер
public class GeoPointConverter : ValueConverter<GeoPoint, Geometry>
{
private static readonly GeometryFactory _geometryFactory = new(new PrecisionModel(), 4326);
public GeoPointConverter() : base(
domainValue => ToProvider(domainValue),
dbValue => FromProvider(dbValue))
{
}
public static Geometry ToProvider(GeoPoint domainPoint)
{
return _geometryFactory.CreatePoint(
new Coordinate(domainPoint.Longitude, domainPoint.Latitude)
);
}
public static GeoPoint? FromProvider(Geometry dbPoint)
{
if (dbPoint == null || dbPoint.IsEmpty)
return null;
return new GeoPoint(
dbPoint.Coordinate.Y, // Latitude
dbPoint.Coordinate.X // Longitude
);
}
}