为什么不完全使用SQL进行计算,因为这是最好的方法,并简单地获得一个已经填充了距离的表格呢?
来自现有答案。
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
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中并调用该视图即可,让我们来想象一下:
SELECT
latitude, longitude, name, latitude1, longitude2, postcode,
udf_Haversine(latitude, longitude, latitude2, longitude2) AS distance
FROM
venuepostcodes
ORDER BY
distance
并使用LINQ直接调用该视图。
edmx
文件,只需右键单击并选择“函数导入...”。 - balexandre