ef表达式获取距离内的位置

gmxoilav  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(320)

我正在尝试查询我的数据库以查找某个位置内的所有事件。我想能够通过数据库查询,这样我就不必拉所有的事件,所以我试图转换成一个表达式一些代码。原始代码在此处找到:

public static Expression<Func<Location, bool>> GetWithinDistanceExpression(this Location current, double withinDistance, DistanceUnits units)
{
    //in the EQ converts something to meters
    double toMeters = 6376500;
    double toRadiants = 0.0174532925199433;
    double currentLat = current.Latitude * toRadiants;
    double currentLong = current.Longitude * toRadiants;

    return loc => 

        (2 * Math.Atan2(
                Math.Sqrt(
                    //TODO: Merge Expressions instead of copy pasta.
                    Math.Pow(Math.Sin((loc.Latitude - currentLat) / 2), 2) + Math.Cos(currentLat) * Math.Cos(loc.Latitude * toRadiants)
                        * Math.Pow(Math.Sin((loc.Longitude - currentLong) / 2), 2)
                ),
                Math.Sqrt(1 -
                    //TODO: Merge Expressions instead of copy pasta.
                    Math.Pow(Math.Sin((loc.Latitude - currentLat) / 2), 2) + Math.Cos(currentLat)
                        * Math.Cos(loc.Latitude * toRadiants) * Math.Pow(Math.Sin((loc.Longitude - currentLong) / 2), 2)
                )
            )
        )    
            * toMeters
            < withinDistance;
}

但是,当我在db中查询location中的东西时,这不会返回任何结果。我猜这和铸造时的精密度有关。
如何在2个坐标的特定距离内获取位置?

ngynwnxp

ngynwnxp1#

public static IQueryable<Location> GetLocationsWithinMeter(this DbSet<Location> locations, double lat, double longitude, double withinMeters)
    {
        //Use Interpolated to create parameterized Query
        return locations.FromSqlInterpolated(
            @$"
        SELECT * FROM(
            SELECT l.*, (
              6371392.896 * acos (
              cos ( radians({lat}) )
              * cos( radians( l.[Latitude] ) )
              * cos( radians( l.[Longitude] ) - radians({longitude}) )
              + sin ( radians({lat}) )
              * sin( radians( [Latitude] ) )
            )
        ) AS distance
        FROM Locations l) locInfo
        WHERE distance < {withinMeters}"
        );
    }

相关问题