Вы можете использовать формулу Haversine (см. Ответ @tdammers), чтобы вычислить расстояние между каждой точкой (Lat, Long) в вашей таблице и данной точкой. Вам нужно будет перебрать всю коллекцию, чтобы оценить каждую точку индивидуально.
Или, если вы используете SQL Server 2008, тогда геопространственная поддержка встроена. Каждая запись будет хранить местоположение как тип географии (возможно, в дополнение к двум дискретным столбцам для хранения широты и долготы, если проще разбить эти значения), а затем вы можете создать простой запрос SQL:
DECLARE @Point geography = 'POINT(-83.12345 45.12345)' -- Note: Long Lat ordering required when using WKT
SELECT *
FROM tblStreetLamps
WHERE location.STDistance(@point) < 1 * 1609.344 -- Note: 1 mile converted to meters
Еще одна похожая возможность - использовать типы SQL Spatial в вашем .NET-приложении. Распространяемый дистрибутив находится здесь: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=CEB4346F-657F-4D28-83F5-AAE0C5C83D52 (в Microsoft® System CLR Types для SQL Server® 2008 R2).
Затем запрос можно выполнить через LINQ. Примечание: это избавляет вас от реализации Haversine самостоятельно, в противном случае процесс запроса будет таким же.
var yourLocation = SqlGeography.Point(Latitude, Longitude, 4326);
var query = from fac in FacilityList
let distance = SqlGeography
.Point(fac.Lat, fac.Lon, 4326)
.STDistance(yourLocation)
.Value
where distance < 1 * 1609.344
orderby distance
select fac;
return query.Distinct().ToList();