100% 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 --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 に追加してそのビューを呼び出すことができます。想像してみましょう。
SELECT
latitude, longitude, name, latitude1, longitude2, postcode,
udf_Haversine(latitude, longitude, latitude2, longitude2) AS distance
FROM
venuepostcodes
ORDER BY
distance
LINQ を使用してそのビューを直接呼び出します。