我的sql server上的这个查询返回了很多行:
declare @referencepoint Geography = Geography::Point(48.208173, 16.373813, 4326);
SELECT *
FROM myTable
WHERE Location.STDistance(@referencepoint) < 20000
但EF中的等价物返回无:
DbGeography referencepoint = DbGeography.PointFromText("POINT(48.208173 16.373813)", 4326);
var records = (from r in db.myTable
where r.Location.Distance(referencepoint ) <= 20000
select r).ToList();
查看通过探查器生成的查询,我看到了:
declare @p3 sys.geography
set @p3=convert(sys.geography,0xE6100000010CD4D17135B25F30408274B169A51A4840)
SELECT *
FROM [myTable]
WHERE ([Location].STDistance(@p3)) <= 20000
EF在这里有问题,还是我?
答案 0 :(得分:0)
OP在这里有问题:) SQL和EF都按预期工作。 OP的陈述不正确。
SQL Point语法:
declare @referencepoint Geography = Geography::Point(48.208173, 16.373813, 4326);
实际上 等同于.Net:
DbGeography referencepoint = DbGeography.PointFromText("POINT(16.373813 48.208173)", 4326);
// Note the parameters are reversed from OP's statement
在SQL和EF(.Net)中,Geography数据类型使用标准的WellKnownText表示法在内部定义点和多边形以及其他结构。
在WellKnownText格式中,在笛卡尔平面上将点指定为POINT(X Y)。 - 注意缺少逗号,值只用空格分隔
当我们想要将地球上的位置表示为笛卡尔平面上的点时,X轴是赤道,Y轴则是在北极和南极之间运行的Meridian线。
Longitute ,根据定义是地球表面的东西位置(与赤道平行,X纵坐标)
Latitude ,根据定义是地球表面的南北位置(垂直于赤道,Y纵坐标)
因此,要以WellKnownText格式表示地球上的一个点,好像它是笛卡尔平面上的一个点,我们必须使用这种语法:
POINT(经度纬度)
令人困惑的问题是,在大多数口头和书面形式中,我们按顺序引用纬度和经度,因此在SQL中我们有一个辅助函数,它按顺序获取参数,因为这可以减少混淆。在某种程度上,因为参数被恰当地命名。为了进一步解释这一点,我已经通过修正扩展了OP的陈述
<强> SQL 强>
DECLARE @latitude float = 48.208173
DECLARE @longitude float = 16.373813
DECLARE @srid int = 4326
DECLARE @referencepoint Geography = Geography::Point(@latitude, @longitude, @srid);
SELECT *
FROM myTable
WHERE Location.STDistance(@referencepoint) < 20000
<强>净强>
double latitude = 48.208173;
double longitude = 16.373813;
int srid = 4326;
DbGeography referencepoint = DbGeography.PointFromText($"POINT({longitude} {latitude})", srid);
var records = (from r in db.myTable
where r.Location.Distance(referencepoint) <= 20000
select r).ToList();
我甚至找不到一个很好的参考资料来解释为什么我们一般都会提到纬度和经度(按此顺序)我怀疑它是基于LatLon更好地滚出舌头还是因为首先发现/测量了纬度?< / p>