Ger*_*man 4 c# asp.net linq-to-entities
我想显示基于具有指定半径的经度和纬度的数据。
例:
我有一条记录,纬度为55.0628,经度为-162.3056,没有指定状态。
我如何只使用实体对linq显示一个状态内的记录?
如果我要显示佛罗里达州,请只显示佛罗里达州内的记录。
Table Data
id item latitude longitude
1 townhome 55.0628 -162.3056
Table postal codes
id state city latitude longitude
1 alaska Akutan 54.143 -165.7854
2 Alabama Huntsville 34.7448 -86.6704
Run Code Online (Sandbox Code Playgroud)
我将执行尽可能接近实际数据的查询(这可能意味着绕过LINQ并调用存储过程)。
这是我用来计算两个位置之间距离的SQL用户定义函数。它利用了SQL Server 2008中引入的新地理功能。
CREATE FUNCTION [dbo].[GetDistanceBetween]
(
@Lat1 float,
@Long1 float,
@Lat2 float,
@Long2 float
)
RETURNS float
AS
BEGIN
DECLARE @RetVal float;
SET @RetVal = ( SELECT geography::Point(@Lat1, @Long1, 4326).STDistance(geography::Point(@Lat2, @Long2, 4326)) / 1609.344 );
RETURN @RetVal;
END
Run Code Online (Sandbox Code Playgroud)
函数返回的距离以英里为单位,并且根据我的经验来说非常快(这显然取决于您需要进行多少次比较)。
您可以使用类似这样的名称:
DECLARE @StartingLatitude FLOAT, @StartingLongitude FLOAT;
DECLARE @MaxDistance FLOAT = 50;
SELECT * FROM PostalCodes
WHERE dbo.GetDistanceBetween(@StartingLatitude, @StartingLongitude, latitude, longitude) <= @MaxDistance;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3078 次 |
| 最近记录: |