我将用户存储在设置了纬度和经度的数据库中。我想在服务层中编写一个过滤方法。
我们正在使用ASP.NET MVC和存储库模式。我们现在将使用实体框架和SQLServer。可以稍后切换到Azure或Amazon。
我的过滤方法如下所示:
public static IQueryable<IPerson> InRadius(this IQueryable<IPerson> query, Coordinate center, double radius)
{
return (from u in query
where
(Math.Pow(u.Location.Coordinate.Latitude - center.Latitude, 2) +
Math.Pow(u.Location.Coordinate.Longitude - center.Longitude, 2)) < Math.Pow(radius, 2)
select u);
}
看着这个,出了点问题。这是正常三角学的公式。这假设半径与纬度和经度所在的单位的测量值相同。
我对此代码有几个问题:
Math.Pow(double,double)
传递给数据库吗?答案 0 :(得分:0)
Math.Pow
应该由实体框架映射到sql中的适当方法。答案 1 :(得分:0)
它可能已映射到POWER
,但您必须尝试并确定无误。
如果它未转换为SQL,只需将Math.Pow(someExpression, 2)
更改为someExpression * someExpression
即可。这肯定会在数据库上执行。
您无法使用经度和纬度计算距离。地球表面的情况与笛卡尔平面的情况不同。