diff --git a/src/EFCore.PG.NTS/Extensions/NpgsqlNetTopologySuiteDbFunctionsExtensions.cs b/src/EFCore.PG.NTS/Extensions/NpgsqlNetTopologySuiteDbFunctionsExtensions.cs
index 4dabe27a1..c462aedd8 100644
--- a/src/EFCore.PG.NTS/Extensions/NpgsqlNetTopologySuiteDbFunctionsExtensions.cs
+++ b/src/EFCore.PG.NTS/Extensions/NpgsqlNetTopologySuiteDbFunctionsExtensions.cs
@@ -7,6 +7,12 @@ namespace Microsoft.EntityFrameworkCore;
///
public static class NpgsqlNetTopologySuiteDbFunctionsExtensions
{
+ ///
+ ///
+ ///
+ public static bool IntersectsBbox(this DbFunctions _, Geometry geometry, Geometry anotherGeometry)
+ => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(IntersectsBbox)));
+
///
/// Returns a new geometry with its coordinates transformed to a different spatial reference system.
/// Translates to ST_Transform(geometry, srid).
diff --git a/src/EFCore.PG.NTS/Query/ExpressionTranslators/Internal/NpgsqlNetTopologySuiteMethodCallTranslatorPlugin.cs b/src/EFCore.PG.NTS/Query/ExpressionTranslators/Internal/NpgsqlNetTopologySuiteMethodCallTranslatorPlugin.cs
index 896589719..05624ac73 100644
--- a/src/EFCore.PG.NTS/Query/ExpressionTranslators/Internal/NpgsqlNetTopologySuiteMethodCallTranslatorPlugin.cs
+++ b/src/EFCore.PG.NTS/Query/ExpressionTranslators/Internal/NpgsqlNetTopologySuiteMethodCallTranslatorPlugin.cs
@@ -104,6 +104,11 @@ public NpgsqlGeometryMethodTranslator(
method.ReturnType,
arguments[1].TypeMapping),
+ nameof(NpgsqlNetTopologySuiteDbFunctionsExtensions.IntersectsBbox) => _sqlExpressionFactory.MakePostgresBinary(
+ PgExpressionType.Overlaps,
+ arguments[1],
+ arguments[2]),
+
nameof(NpgsqlNetTopologySuiteDbFunctionsExtensions.DistanceKnn) => _sqlExpressionFactory.MakePostgresBinary(
PgExpressionType.Distance,
arguments[1],
diff --git a/test/EFCore.PG.FunctionalTests/Query/SpatialQueryNpgsqlGeometryTest.cs b/test/EFCore.PG.FunctionalTests/Query/SpatialQueryNpgsqlGeometryTest.cs
index 6bf97811b..e0dcd8c57 100644
--- a/test/EFCore.PG.FunctionalTests/Query/SpatialQueryNpgsqlGeometryTest.cs
+++ b/test/EFCore.PG.FunctionalTests/Query/SpatialQueryNpgsqlGeometryTest.cs
@@ -362,6 +362,32 @@ public override async Task Intersection(bool async)
""");
}
+ [ConditionalTheory]
+ [MemberData(nameof(IsAsyncData))]
+ public async Task IntersectsBbox(bool async)
+ {
+ var polygon = Fixture.GeometryFactory.CreatePolygon([new Coordinate(0, 0), new Coordinate(1, 0), new Coordinate(0, 1), new Coordinate(0, 0)]);
+
+ await AssertQuery(
+ async,
+ ss => ss.Set().Select(e => new { e.Id, IntersectsBbox = (bool?)EF.Functions.IntersectsBbox(e.Polygon, polygon) }),
+ ss => ss.Set().Select(e => new { e.Id, IntersectsBbox = (e.Polygon == null ? (bool?)null : e.Polygon.EnvelopeInternal.Intersects(polygon.EnvelopeInternal)) }),
+ elementSorter: e => e.Id,
+ elementAsserter: (e, a) =>
+ {
+ Assert.Equal(e.Id, a.Id);
+ Assert.Equal(e.IntersectsBbox, a.IntersectsBbox);
+ });
+
+ AssertSql(
+ """
+@__polygon_1='POLYGON ((0 0, 1 0, 0 1, 0 0))' (DbType = Object)
+
+SELECT p."Id", p."Polygon" && @__polygon_1 AS "IntersectsBbox"
+FROM "PolygonEntity" AS p
+""");
+ }
+
public override async Task Intersects(bool async)
{
await base.Intersects(async);