我将用户存储在一个设置了纬度和经度的数据库中。我想在我的服务层中编写一个过滤器方法。
我们将 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);
}
看到这里,有些不对劲。这是正态三角函数的公式。这是假设半径与纬度和经度所在的单位相同。
我对这段代码有几个问题:
- 因为服务层应该不知道ORM,所以这个查询会在数据库上执行吗?会
Math.Pow(double,double)
被传递到数据库吗? - 如果无法在数据库上完成,那么过滤此数据的最有效方法是什么。我不想全部下拉,然后在我的应用程序中对它们进行排序。
- 地理问题:有没有办法将距离(无论是英里、公里)转换为纬度和经度使用的单位吗?这如果用于半径问题。