Я бы выполнил запрос как можно ближе к фактическим данным (что, вероятно, означает, что нужно обойти 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
Функция возвращает расстояние в милях и очень быстро в моем опыте (это, очевидно, будет зависеть от того, сколько сравнений вам нужно сделать).
Вы можете назвать это, используя что-то вроде:
DECLARE @StartingLatitude FLOAT, @StartingLongitude FLOAT;
DECLARE @MaxDistance FLOAT = 50;
SELECT * FROM PostalCodes
WHERE dbo.GetDistanceBetween(@StartingLatitude, @StartingLongitude, latitude, longitude) <= @MaxDistance;