Entity Framework距离查询

4
我们在SQL Server中有一个包含纬度经度列的表。 我们希望使用以下查询从特定点查询最近的位置:
SELECT TOP (1) 
    [ID], [Lat], [Lng],
    geography::Point(32, 34, 4326).STDistance(geography::Point([Lat], [Lng], 4326)) as Dist
FROM 
    [Area]
ORDER BY 
    Dist

有没有使用EF的方法,让SQL Server进行距离计算呢?
谢谢。

以前从未尝试过,但EF 对此提供了一些支持,并且在EntityFramework6 Github中确实存在。 - Bagus Tesa
EF确实支持空间类型,但无论使用哪种数据库,距离查询始终很慢。这是因为数据库必须计算与数据库中每个点的距离。您必须限制搜索范围,例如提供纬度/经度的范围条件,或创建一个覆盖图像(圆形或正方形),并仅选择其中包含的行。 - Panagiotis Kanavos
3
Microsoft Docs 介绍了如何通过空间索引来优化 SQL Server 中的最近邻查询。要使用空间索引,必须满足一些特定的标准。例如,您当前的查询不能使用空间索引。请参考 how to optimize nearest neighbor queries with spatial indexes 获取更多信息。 - Panagiotis Kanavos
2
为什么不编写存储过程并将EF绑定到它? - Liam
这些点的数量和分布是什么?100个点还是100公里左右的点?Haversine公式是最好的,但耗时较长。勾股定理不太准确,但速度更快。 - Mad Myche
1个回答

1
我想到的最简单的解决方案就是使用原始查询,而 EF Core(我假设你正在使用它)会处理其余部分。
var blogs = context.Blogs
.FromSql("SELECT * FROM dbo.Blogs")
.ToList();

关于原始查询的更多信息,请点击此处https://learn.microsoft.com/en-us/ef/core/querying/raw-sql

另外,如您在问题评论中所提到的,您需要向查询中添加WHERE以使其运行更快。类似这样:

WHERE [Latitude] < TopLatBound 
    AND [Latitude] > BottomLatBound 
    AND [Longitude] > LeftLngBound 
    AND [Longitude] < RightLngBound

你可以按照这里https://gis.stackexchange.com/questions/142326/calculating-longitude-length-in-miles所述的方法,将期望的最大距离转换为纬度和经度来计算边界。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接