Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
jobily
Efcore.Pg
提交
aebc18ad
E
Efcore.Pg
项目概览
jobily
/
Efcore.Pg
11 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
Efcore.Pg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
aebc18ad
编写于
4月 28, 2021
作者:
S
Shay Rojansky
提交者:
GitHub
4月 28, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add translation for Postgis <-> (DistanceKnn) (#1828)
Closes #1827
上级
24491d4b
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
137 addition
and
55 deletion
+137
-55
src/EFCore.PG.NTS/Extensions/NpgsqlNetTopologySuiteDbFunctionsExtensions.cs
...Extensions/NpgsqlNetTopologySuiteDbFunctionsExtensions.cs
+23
-4
src/EFCore.PG.NTS/Query/ExpressionTranslators/Internal/NpgsqlNetTopologySuiteMethodCallTranslatorPlugin.cs
...ernal/NpgsqlNetTopologySuiteMethodCallTranslatorPlugin.cs
+14
-5
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlFullTextSearchMethodTranslator.cs
...nslators/Internal/NpgsqlFullTextSearchMethodTranslator.cs
+1
-0
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlJsonDbFunctionsTranslator.cs
...onTranslators/Internal/NpgsqlJsonDbFunctionsTranslator.cs
+1
-0
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlLTreeTranslator.cs
...y/ExpressionTranslators/Internal/NpgsqlLTreeTranslator.cs
+1
-0
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlNetworkTranslator.cs
...ExpressionTranslators/Internal/NpgsqlNetworkTranslator.cs
+1
-0
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlRangeTranslator.cs
...y/ExpressionTranslators/Internal/NpgsqlRangeTranslator.cs
+1
-0
src/EFCore.PG/Query/Expressions/Internal/PostgresBinaryExpression.cs
...PG/Query/Expressions/Internal/PostgresBinaryExpression.cs
+2
-0
src/EFCore.PG/Query/Expressions/Internal/PostgresExpressionType.cs
...e.PG/Query/Expressions/Internal/PostgresExpressionType.cs
+0
-41
src/EFCore.PG/Query/Expressions/PostgresExpressionType.cs
src/EFCore.PG/Query/Expressions/PostgresExpressionType.cs
+43
-0
src/EFCore.PG/Query/Internal/NpgsqlQuerySqlGenerator.cs
src/EFCore.PG/Query/Internal/NpgsqlQuerySqlGenerator.cs
+4
-2
src/EFCore.PG/Query/Internal/NpgsqlSqlNullabilityProcessor.cs
...EFCore.PG/Query/Internal/NpgsqlSqlNullabilityProcessor.cs
+3
-0
src/EFCore.PG/Query/NpgsqlSqlExpressionFactory.cs
src/EFCore.PG/Query/NpgsqlSqlExpressionFactory.cs
+15
-0
test/EFCore.PG.FunctionalTests/Query/SpatialQueryNpgsqlGeographyTest.cs
....FunctionalTests/Query/SpatialQueryNpgsqlGeographyTest.cs
+28
-3
未找到文件。
src/EFCore.PG.NTS/Extensions/NpgsqlNetTopologySuiteDbFunctionsExtensions.cs
浏览文件 @
aebc18ad
...
...
@@ -9,10 +9,9 @@ public static class NpgsqlNetTopologySuiteDbFunctionsExtensions
{
/// <summary>
/// Returns a new geometry with its coordinates transformed to a different spatial reference system.
/// Translates to <c>ST_Transform(geometry, srid)</c>.
/// </summary>
/// <remarks>
/// The method call is translated to <c>ST_Transform(geometry, srid)</c>.
///
/// See https://postgis.net/docs/ST_Transform.html.
/// </remarks>
public
static
TGeometry
Transform
<
TGeometry
>(
this
DbFunctions
_
,
TGeometry
geometry
,
int
srid
)
...
...
@@ -21,24 +20,44 @@ public static TGeometry Transform<TGeometry>(this DbFunctions _, TGeometry geome
/// <summary>
/// Tests whether the distance from the origin geometry to another is less than or equal to a specified value.
/// Translates to <c>ST_DWithin</c>.
/// </summary>
/// <remarks>
/// See https://postgis.net/docs/ST_DWithin.html.
/// </remarks>
/// <param name="geometry">The origin geometry.</param>
/// <param name="anotherGeometry">The geometry to check the distance to.</param>
/// <param name="distance">The distance value to compare.</param>
/// <param name="useSpheroid">Whether to use sphere or spheroid distance measurement.</param>
/// <returns>
True
if the geometries are less than distance apart.</returns>
/// <returns>
<see langword="true" />
if the geometries are less than distance apart.</returns>
public
static
bool
IsWithinDistance
(
this
DbFunctions
_
,
Geometry
geometry
,
Geometry
anotherGeometry
,
double
distance
,
bool
useSpheroid
)
=>
throw
new
InvalidOperationException
(
CoreStrings
.
FunctionOnClient
(
nameof
(
IsWithinDistance
)));
/// <summary>
/// Returns the minimum distance between the origin geometry and another geometry g.
/// Translates to <c>ST_Distance</c>.
/// </summary>
/// <remarks>
/// See https://postgis.net/docs/ST_Distance.html.
/// </remarks>
/// <param name="geometry">The origin geometry.</param>
/// <param name="anotherGeometry">The geometry from which to compute the distance.</param>
/// <param name="useSpheroid">Whether to use sphere or spheroid distance measurement.</param>
/// <returns>The distance between the geometries.</returns>
/// <exception cref="ArgumentException">If g is null</exception>
public
static
double
Distance
(
this
DbFunctions
_
,
Geometry
geometry
,
Geometry
anotherGeometry
,
bool
useSpheroid
)
=>
throw
new
InvalidOperationException
(
CoreStrings
.
FunctionOnClient
(
nameof
(
Distance
)));
/// <summary>
/// Returns the 2D distance between two geometries. Used in the "ORDER BY" clause, provides index-assisted nearest-neighbor result
/// sets. Translates to <c><-></c>.
/// </summary>
/// <remarks>
/// See https://postgis.net/docs/ST_Distance.html.
/// </remarks>
/// <param name="geometry">The origin geometry.</param>
/// <param name="anotherGeometry">The geometry from which to compute the distance.</param>
/// <returns>The 2D distance between the geometries.</returns>
public
static
double
DistanceKnn
(
this
DbFunctions
_
,
Geometry
geometry
,
Geometry
anotherGeometry
)
=>
throw
new
InvalidOperationException
(
CoreStrings
.
FunctionOnClient
(
nameof
(
DistanceKnn
)));
}
}
src/EFCore.PG.NTS/Query/ExpressionTranslators/Internal/NpgsqlNetTopologySuiteMethodCallTranslatorPlugin.cs
浏览文件 @
aebc18ad
...
...
@@ -9,6 +9,7 @@
using
Microsoft.EntityFrameworkCore.Query.SqlExpressions
;
using
Microsoft.EntityFrameworkCore.Storage
;
using
NetTopologySuite.Geometries
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
// ReSharper disable once CheckNamespace
namespace
Npgsql.EntityFrameworkCore.PostgreSQL.Query.ExpressionTranslators.Internal
...
...
@@ -18,10 +19,13 @@ public class NpgsqlNetTopologySuiteMethodCallTranslatorPlugin : IMethodCallTrans
public
NpgsqlNetTopologySuiteMethodCallTranslatorPlugin
(
IRelationalTypeMappingSource
typeMappingSource
,
ISqlExpressionFactory
sqlExpressionFactory
)
=>
Translators
=
new
IMethodCallTranslator
[]
{
if
(!(
sqlExpressionFactory
is
NpgsqlSqlExpressionFactory
npgsqlSqlExpressionFactory
))
{
new
NpgsqlGeometryMethodTranslator
(
sqlExpressionFactory
,
typeMappingSource
),
};
throw
new
ArgumentException
(
$"Must be an
{
nameof
(
NpgsqlSqlExpressionFactory
)}
"
,
nameof
(
sqlExpressionFactory
));
}
Translators
=
new
IMethodCallTranslator
[]
{
new
NpgsqlGeometryMethodTranslator
(
npgsqlSqlExpressionFactory
,
typeMappingSource
),
};
}
public
virtual
IEnumerable
<
IMethodCallTranslator
>
Translators
{
get
;
}
}
...
...
@@ -33,7 +37,7 @@ public class NpgsqlGeometryMethodTranslator : IMethodCallTranslator
{
private
static
readonly
MethodInfo
_collectionItem
=
typeof
(
GeometryCollection
).
GetRuntimeProperty
(
"Item"
)!.
GetMethod
!;
private
readonly
I
SqlExpressionFactory
_sqlExpressionFactory
;
private
readonly
Npgsql
SqlExpressionFactory
_sqlExpressionFactory
;
private
readonly
IRelationalTypeMappingSource
_typeMappingSource
;
private
static
readonly
bool
[][]
TrueArrays
=
...
...
@@ -46,7 +50,7 @@ public class NpgsqlGeometryMethodTranslator : IMethodCallTranslator
};
public
NpgsqlGeometryMethodTranslator
(
I
SqlExpressionFactory
sqlExpressionFactory
,
Npgsql
SqlExpressionFactory
sqlExpressionFactory
,
IRelationalTypeMappingSource
typeMappingSource
)
{
_sqlExpressionFactory
=
sqlExpressionFactory
;
...
...
@@ -78,6 +82,11 @@ public class NpgsqlGeometryMethodTranslator : IMethodCallTranslator
method
.
ReturnType
,
arguments
[
1
].
TypeMapping
),
nameof
(
NpgsqlNetTopologySuiteDbFunctionsExtensions
.
DistanceKnn
)
=>
_sqlExpressionFactory
.
MakePostgresBinary
(
PostgresExpressionType
.
PostgisDistanceKnn
,
arguments
[
1
],
arguments
[
2
]),
nameof
(
NpgsqlNetTopologySuiteDbFunctionsExtensions
.
Distance
)
=>
TranslateGeometryMethod
(
arguments
[
1
],
method
,
new
[]
{
arguments
[
2
],
arguments
[
3
]
}),
nameof
(
NpgsqlNetTopologySuiteDbFunctionsExtensions
.
IsWithinDistance
)
=>
...
...
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlFullTextSearchMethodTranslator.cs
浏览文件 @
aebc18ad
...
...
@@ -7,6 +7,7 @@
using
Microsoft.EntityFrameworkCore.Query
;
using
Microsoft.EntityFrameworkCore.Query.SqlExpressions
;
using
Microsoft.EntityFrameworkCore.Storage
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
;
using
NpgsqlTypes
;
using
static
Npgsql
.
EntityFrameworkCore
.
PostgreSQL
.
Utilities
.
Statics
;
...
...
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlJsonDbFunctionsTranslator.cs
浏览文件 @
aebc18ad
...
...
@@ -8,6 +8,7 @@
using
Microsoft.EntityFrameworkCore.Query
;
using
Microsoft.EntityFrameworkCore.Query.SqlExpressions
;
using
Microsoft.EntityFrameworkCore.Storage
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.Mapping
;
using
static
Npgsql
.
EntityFrameworkCore
.
PostgreSQL
.
Utilities
.
Statics
;
...
...
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlLTreeTranslator.cs
浏览文件 @
aebc18ad
...
...
@@ -12,6 +12,7 @@
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Internal
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Internal
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
using
static
Npgsql
.
EntityFrameworkCore
.
PostgreSQL
.
Utilities
.
Statics
;
namespace
Npgsql.EntityFrameworkCore.PostgreSQL.Query.ExpressionTranslators.Internal
...
...
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlNetworkTranslator.cs
浏览文件 @
aebc18ad
...
...
@@ -9,6 +9,7 @@
using
Microsoft.EntityFrameworkCore.Query
;
using
Microsoft.EntityFrameworkCore.Query.SqlExpressions
;
using
Microsoft.EntityFrameworkCore.Storage
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
;
using
static
Npgsql
.
EntityFrameworkCore
.
PostgreSQL
.
Utilities
.
Statics
;
...
...
src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlRangeTranslator.cs
浏览文件 @
aebc18ad
...
...
@@ -7,6 +7,7 @@
using
Microsoft.EntityFrameworkCore.Query
;
using
Microsoft.EntityFrameworkCore.Query.SqlExpressions
;
using
Microsoft.EntityFrameworkCore.Storage
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.Mapping
;
using
NpgsqlTypes
;
...
...
src/EFCore.PG/Query/Expressions/Internal/PostgresBinaryExpression.cs
浏览文件 @
aebc18ad
...
...
@@ -127,6 +127,8 @@ protected override void Print(ExpressionPrinter expressionPrinter)
PostgresExpressionType
.
JsonExistsAny
=>
"?|"
,
PostgresExpressionType
.
JsonExistsAll
=>
"?&"
,
PostgresExpressionType
.
PostgisDistanceKnn
=>
"<->"
,
_
=>
throw
new
ArgumentOutOfRangeException
(
$"Unhandled operator type:
{
OperatorType
}
"
)
})
.
Append
(
" "
);
...
...
src/EFCore.PG/Query/Expressions/Internal/PostgresExpressionType.cs
已删除
100644 → 0
浏览文件 @
24491d4b
namespace
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
{
/// <summary>
/// PostgreSQL-specific expression node types.
/// </summary>
public
enum
PostgresExpressionType
{
Contains
,
ContainedBy
,
Overlaps
,
AtTimeZone
,
NetworkContainedByOrEqual
,
NetworkContainsOrEqual
,
NetworkContainsOrContainedBy
,
RangeIsStrictlyLeftOf
,
RangeIsStrictlyRightOf
,
RangeDoesNotExtendRightOf
,
RangeDoesNotExtendLeftOf
,
RangeIsAdjacentTo
,
RangeUnion
,
RangeIntersect
,
RangeExcept
,
TextSearchMatch
,
TextSearchAnd
,
TextSearchOr
,
JsonExists
,
JsonExistsAny
,
JsonExistsAll
,
LTreeMatches
,
LTreeMatchesAny
,
LTreeFirstAncestor
,
LTreeFirstDescendent
,
LTreeFirstMatches
}
}
src/EFCore.PG/Query/Expressions/PostgresExpressionType.cs
0 → 100644
浏览文件 @
aebc18ad
namespace
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
{
/// <summary>
/// PostgreSQL-specific expression node types.
/// </summary>
public
enum
PostgresExpressionType
{
Contains
,
// >> (inet/cidr), @>
ContainedBy
,
// << (inet/cidr), <@
Overlaps
,
// &&
AtTimeZone
,
// AT TIME ZONE
NetworkContainedByOrEqual
,
// <<=
NetworkContainsOrEqual
,
// >>=
NetworkContainsOrContainedBy
,
// &&
RangeIsStrictlyLeftOf
,
// <<
RangeIsStrictlyRightOf
,
// >>
RangeDoesNotExtendRightOf
,
// &<
RangeDoesNotExtendLeftOf
,
// &>
RangeIsAdjacentTo
,
// -|-
RangeUnion
,
// +
RangeIntersect
,
// *
RangeExcept
,
// -
TextSearchMatch
,
// @@
TextSearchAnd
,
// &&
TextSearchOr
,
// ||
JsonExists
,
// ?
JsonExistsAny
,
// ?@>
JsonExistsAll
,
// ?<@
LTreeMatches
,
// ~ or @
LTreeMatchesAny
,
// ?
LTreeFirstAncestor
,
// ?@>
LTreeFirstDescendent
,
// ?<@
LTreeFirstMatches
,
// ?~ or ?@
PostgisDistanceKnn
// <->
}
}
src/EFCore.PG/Query/Internal/NpgsqlQuerySqlGenerator.cs
浏览文件 @
aebc18ad
...
...
@@ -9,6 +9,7 @@
using
Microsoft.EntityFrameworkCore.Query.SqlExpressions
;
using
Microsoft.EntityFrameworkCore.Storage
;
using
Microsoft.EntityFrameworkCore.Utilities
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.Mapping
;
using
NpgsqlTypes
;
...
...
@@ -300,8 +301,9 @@ protected virtual Expression VisitPostgresBinary(PostgresBinaryExpression binary
PostgresExpressionType
.
LTreeFirstMatches
when
binaryExpression
.
Right
.
TypeMapping
.
StoreType
==
"ltxtquery"
=>
"?@"
,
_
=>
throw
new
ArgumentOutOfRangeException
(
$"Unhandled operator type:
{
binaryExpression
.
OperatorType
}
"
)
PostgresExpressionType
.
PostgisDistanceKnn
=>
"<->"
,
_
=>
throw
new
ArgumentOutOfRangeException
(
$"Unhandled operator type:
{
binaryExpression
.
OperatorType
}
"
)
})
.
Append
(
" "
);
...
...
src/EFCore.PG/Query/Internal/NpgsqlSqlNullabilityProcessor.cs
浏览文件 @
aebc18ad
...
...
@@ -3,6 +3,7 @@
using
Microsoft.EntityFrameworkCore.Query
;
using
Microsoft.EntityFrameworkCore.Query.SqlExpressions
;
using
Microsoft.EntityFrameworkCore.Utilities
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.Mapping
;
using
static
Npgsql
.
EntityFrameworkCore
.
PostgreSQL
.
Utilities
.
Statics
;
...
...
@@ -197,9 +198,11 @@ PostgresUnknownBinaryExpression postgresUnknownBinaryExpression
nullable
=
binaryExpression
.
OperatorType
switch
{
// The following LTree search methods return null for "not found"
PostgresExpressionType
.
LTreeFirstAncestor
=>
true
,
PostgresExpressionType
.
LTreeFirstDescendent
=>
true
,
PostgresExpressionType
.
LTreeFirstMatches
=>
true
,
_
=>
leftNullable
||
rightNullable
};
...
...
src/EFCore.PG/Query/NpgsqlSqlExpressionFactory.cs
浏览文件 @
aebc18ad
...
...
@@ -9,6 +9,7 @@
using
Microsoft.EntityFrameworkCore.Query.SqlExpressions
;
using
Microsoft.EntityFrameworkCore.Storage
;
using
Microsoft.EntityFrameworkCore.Utilities
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Query.Expressions.Internal
;
using
Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.Mapping
;
...
...
@@ -18,6 +19,7 @@ public class NpgsqlSqlExpressionFactory : SqlExpressionFactory
{
private
readonly
IRelationalTypeMappingSource
_typeMappingSource
;
private
readonly
RelationalTypeMapping
_boolTypeMapping
;
private
readonly
RelationalTypeMapping
_doubleTypeMapping
;
private
static
Type
?
_nodaTimeDurationType
;
private
static
Type
?
_nodaTimePeriodType
;
...
...
@@ -27,6 +29,7 @@ public NpgsqlSqlExpressionFactory(SqlExpressionFactoryDependencies dependencies)
{
_typeMappingSource
=
dependencies
.
TypeMappingSource
;
_boolTypeMapping
=
_typeMappingSource
.
FindMapping
(
typeof
(
bool
))!;
_doubleTypeMapping
=
_typeMappingSource
.
FindMapping
(
typeof
(
double
))!;
}
#
region
Expression
factory
methods
...
...
@@ -216,6 +219,10 @@ RelationalTypeMapping FlipTimestampTypeMapping(RelationalTypeMapping mapping)
case
PostgresExpressionType
.
JsonExistsAll
:
returnType
=
typeof
(
bool
);
break
;
case
PostgresExpressionType
.
PostgisDistanceKnn
:
returnType
=
typeof
(
double
);
break
;
}
return
(
PostgresBinaryExpression
)
ApplyTypeMapping
(
...
...
@@ -508,6 +515,14 @@ private SqlExpression ApplyTypeMappingOnILike(PostgresILikeExpression ilikeExpre
break
;
}
case
PostgresExpressionType
.
PostgisDistanceKnn
:
{
inferredTypeMapping
=
typeMapping
??
ExpressionExtensions
.
InferTypeMapping
(
left
,
right
);
resultType
=
typeof
(
double
);
resultTypeMapping
=
_doubleTypeMapping
;
break
;
}
default
:
throw
new
InvalidOperationException
(
$"Incorrect
{
nameof
(
operatorType
)}
for
{
nameof
(
postgresBinaryExpression
)}
"
);
}
...
...
test/EFCore.PG.FunctionalTests/Query/SpatialQueryNpgsqlGeographyTest.cs
浏览文件 @
aebc18ad
...
...
@@ -22,7 +22,7 @@ public SpatialQueryNpgsqlGeographyTest(SpatialQueryNpgsqlGeographyFixture fixtur
:
base
(
fixture
)
{
Fixture
.
TestSqlLoggerFactory
.
Clear
();
Fixture
.
TestSqlLoggerFactory
.
SetTestOutputHelper
(
testOutputHelper
);
//
Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper);
}
protected
override
bool
AssertDistances
...
...
@@ -92,7 +92,7 @@ public override async Task Centroid(bool async)
[
ConditionalTheory
]
[
MemberData
(
nameof
(
IsAsyncDataAndUseSpheroid
))]
public
async
Task
Distance
DbFunction
(
bool
async
,
bool
useSpheroid
)
public
async
Task
Distance
_with_spheroid
(
bool
async
,
bool
useSpheroid
)
{
var
point
=
Fixture
.
GeometryFactory
.
CreatePoint
(
new
Coordinate
(
0
,
1
));
...
...
@@ -116,6 +116,31 @@ public async Task DistanceDbFunction(bool async, bool useSpheroid)
FROM
""
PointEntity
""
AS
p
");
}
[
ConditionalTheory
]
[
MemberData
(
nameof
(
IsAsyncData
))]
public
async
Task
DistanceKnn
(
bool
async
)
{
var
point
=
Fixture
.
GeometryFactory
.
CreatePoint
(
new
Coordinate
(
0
,
1
));
await
AssertQuery
(
async
,
ss
=>
ss
.
Set
<
PointEntity
>().
Select
(
e
=>
new
{
e
.
Id
,
Distance
=
(
double
?)
EF
.
Functions
.
DistanceKnn
(
e
.
Point
,
point
)
}),
ss
=>
ss
.
Set
<
PointEntity
>()
.
Select
(
e
=>
new
{
e
.
Id
,
Distance
=
(
e
.
Point
==
null
?
(
double
?)
null
:
e
.
Point
.
Distance
(
point
))
}),
elementSorter
:
e
=>
e
.
Id
,
elementAsserter
:
(
e
,
a
)
=>
{
Assert
.
Equal
(
e
.
Id
,
a
.
Id
);
Assert
.
Equal
(
e
.
Distance
==
null
,
a
.
Distance
==
null
);
});
AssertSql
(
@"@__point_1='POINT (0 1)' (DbType = Object)
SELECT p.""Id"", p.""Point"" <-> @__point_1 AS ""Distance""
FROM ""PointEntity"" AS p"
);
}
public
override
async
Task
GeometryType
(
bool
async
)
{
// PostGIS returns "POINT", NTS returns "Point"
...
...
@@ -168,7 +193,7 @@ public override async Task IsWithinDistance(bool async)
[
ConditionalTheory
]
[
MemberData
(
nameof
(
IsAsyncDataAndUseSpheroid
))]
public
async
Task
IsWithinDistance
DbFunction
(
bool
async
,
bool
useSpheroid
)
public
async
Task
IsWithinDistance
_with_spheroid
(
bool
async
,
bool
useSpheroid
)
{
var
point
=
Fixture
.
GeometryFactory
.
CreatePoint
(
new
Coordinate
(
0
,
1
));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录