C#、Asp.net、.net ver 2.0、および MSSQL 2005 で「NearBy Properties」モジュールを使用しています。私の要件は、
特定Lat
の値を DB に渡します。渡された値と DB に既に保存されている値Lan
を比較して、最も近い 35 個のプロパティをフェッチする必要があります。これは SQL 部分自体で実行できますか?Lat
Lan
Lat
Lan
私はこれをAsp.net
部分的に行うことができます
- DataTable のすべての行をループしてから、
このように、DataTable に「Miles」という追加フィールドを作成し、Km 値を挿入します。
public decimal calcDistance(decimal latA, decimal longA, decimal latB, decimal longB) { double theDistance = (Math.Sin(DegreesToRadians(latA)) * Math.Sin(DegreesToRadians(latB)) + Math.Cos(DegreesToRadians(latA)) * Math.Cos(DegreesToRadians(latB)) * Math.Cos(DegreesToRadians(longA - longB))); return Convert.ToDecimal((RadiansToDegrees(Math.Acos(theDistance)))) * 69.09M * 1.6093M; }
次に、「マイル」フィールドで DataTable を並べ替え、DataTable から上位 35 行をフェッチします。
問題は、
すべての DB 行を asp 部分にフェッチし、for ループを実行してから並べ替えを行う必要があります。これには多くの時間とリソースが必要です。これを SQL 部分自体で実行する方法はありますか?
解決
以下の@Bacon Bitsの回答を微調整しました
SELECT PM.Id AS PropertyId,PM.Address,PM.PropertyImage, ROUND((DEGREES(ACOS(SIN(RADIANS('9.98')) * SIN(RADIANS(PM.Latitude)) + COS(RADIANS('9.98')) * COS(RADIANS(PM.Latitude)) * COS(RADIANS(76.27999999999997 - PM.Longitude)))) * 69.09 * 1.6093),0) AS Miles
FROM Tbl_PropertyMaster PM
INNER JOIN dbo.Tbl_PropertyApproval AS PA
ON PA.PropertyId = PM.Id
WHERE PM.IsDeleted='False' AND PM.Enabled='True' and PA.Action='Approved' AND ROUND((DEGREES(ACOS(SIN(RADIANS('9.98')) * SIN(RADIANS(PM.Latitude)) + COS(RADIANS('9.98')) * COS(RADIANS(PM.Latitude)) * COS(RADIANS(76.27999999999997 - PM.Longitude)))) * 69.09 * 1.6093),0) < 1000
ORDER BY Miles DESC