我正在使用 C#、Asp.net、.net 2.0 版和 MSSQL 2005 中的“NearBy Properties”模块。我的要求是,
我将一个特定的Lat
值传递Lan
给 DB,它应该通过将传递Lat
Lan
的Lat
Lan
值与已保存在 DB 中的值进行比较来获取我最近的 35 个属性。这可以在 SQL 部分本身中完成吗?
我可以通过以下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; }
然后使用“Miles”字段对 DataTable 进行排序,并从 DataTable 中获取前 35 行。
问题是,
我必须将所有数据库行提取到 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