gpt4 book ai didi

c# - Linq to sql 哈弗正弦公式

转载 作者:行者123 更新时间:2023-11-30 15:03:58 25 4
gpt4 key购买 nike

我在 C# 中实现了 Harversine 公式,在 TSQL 中有一个示例。我不确定如何最好地在服务器端实现该公式,以便我能够在 Linq 查询中使用它。

理想情况下,我只需将本地公式链接到服务器上的函数即可。这样就避免了“没有转换为 sql”的错误,并且一切都很好而且无缝。

显然,对问题的任何看法都是有帮助的。

我知道 SQL2008 中的地理类型。然而,我正在处理的代码库已经非常依赖 Linq to SQL,我希望它比它值得付出更多的努力!

谢谢

最佳答案

为什么不 100% 使用 SQL,因为这是进行计算的最佳方式,而且只需得到一个已经填满距离的表格?

来自existing answer

CREATE FUNCTION dbo.udf_Haversine(@lat1 float, @long1 float, @lat2 float, @long2 float) RETURNS float 
BEGIN
DECLARE @dlon float, @dlat float, @rlat1 float, @rlat2 float, @rlong1 float, @rlong2 float, @a float, @c float, @R float, @d float, @DtoR float

SELECT @DtoR = 0.017453293
SELECT @R = 3937 --3976

SELECT
@rlat1 = @lat1 * @DtoR,
@rlong1 = @long1 * @DtoR,
@rlat2 = @lat2 * @DtoR,
@rlong2 = @long2 * @DtoR

SELECT
@dlon = @rlong1 - @rlong2,
@dlat = @rlat1 - @rlat2

SELECT @a = power(sin(@dlat/2), 2) + cos(@rlat1) * cos(@rlat2) * power(sin(@dlon/2), 2)
SELECT @c = 2 * atn2(sqrt(@a), sqrt(1-@a))
SELECT @d = @R * @c

RETURN @d
END

并像这样使用:

var table = from r in db.VenuePostCodes 
select new {
lat = r.Latitude,
lng = r.Longitude,
name = r.Name,
distance = db.udf_Haversine(
r.Latitude,r.Longitude,
r.Latitude,r.Longitude2)
};

但最好始终将所有内容都放在 SQL 上,这样您的托管服务器就可以少做一些事情,只需将一个 View 添加到您的 SQL 中并调用该 View ,让我们想象一下:

SELECT 
latitude, longitude, name, latitude1, longitude2, postcode,
udf_Haversine(latitude, longitude, latitude2, longitude2) AS distance
FROM
venuepostcodes
ORDER BY
distance

并使用 LINQ 直接调用该 View 。

关于c# - Linq to sql 哈弗正弦公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10918874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com