Usando LINQ encuentra lugares cercanos desde la base de datos
Queremos recibir una lista de lugares cercanos de la base de datos utilizando LINQ en ASP.NET 2012 y nos gustaría recibir comentarios sobre nuestra estrategia.
Mi mesa y datos falsos:
PlaceId Name Latitude Longitude
1 A 18.1 20.1
2 B 18.2 20.2
3 C 18.3 20.3
1) En nuestro proyecto, la ubicación actual del cliente (latitud y longitud) se toma como entrada
2) En el lado del servidor, dependiendo de la ubicación actual del cliente, necesitamos encontrar lugares cercanos de la base de datos utilizando LINQ
Aquí está el código para SQL que usé anteriormente, pero ahora queremos usar LINQ.
SELECT name, Latitude, Longitude ,
( 3959 * acos( cos( radians(?) )* cos( radians( Latitude) ) * cos( radians( Longitude ) - radians(?) )
+ sin( radians(?) ) * sin( radians( Latitude) ) ) ) AS distance
FROM TABLE_NAME
HAVING distance < ?
ORDER BY distance LIMIT 0 , 20
[Pero la pregunta es cómo escribir dicha consulta en LINQ.]
Mi trabajo en esto:
Mientras buscaba la solución, encontré este código.
var Value1 = 57.2957795130823D;
var Value2 = 3958.75586574D;
var searchWithin = 20;
double latitude = ConversionHelper.SafeConvertToDoubleCultureInd(Latitude, 0),
longitude = ConversionHelper.SafeConvertToDoubleCultureInd(Longitude, 0);
var location = (from l in sdbml.Places
let temp = Math.Sin(Convert.ToDouble(l.Latitude) / Value1) * Math.Sin(Convert.ToDouble(latitude) / Value1) +
Math.Cos(Convert.ToDouble(l.Latitude) / Value1) *
Math.Cos(Convert.ToDouble(latitude) / Value1) *
Math.Cos((Convert.ToDouble(longitude) / Value1) - (Convert.ToDouble(l.Longitude) / Value1))
let calMiles = (Value2 * Math.Acos(temp > 1 ? 1 : (temp < -1 ? -1 : temp)))
where (l.Latitude > 0 && l.Longitude > 0)
orderby calMiles
select new location
{
Name = l.name
});
return location .ToList();
Pero el problema es cómo hacer referencia a ConversionHelper o a qué espacio de nombres viene.
Todos los consejos son apreciados.