2

我将用户存储在一个设置了纬度和经度的数据库中。我想在我的服务层中编写一个过滤器方法。

我们将 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);
    }

看到这里,有些不对劲。这是正态三角函数的公式。这是假设半径与纬度和经度所在的单位相同。

我对这段代码有几个问题:

  1. 因为服务层应该不知道ORM,所以这个查询会在数据库上执行吗?会Math.Pow(double,double)被传递到数据库吗?
  2. 如果无法在数据库上完成,那么过滤此数据的最有效方法是什么。我不想全部下拉,然后在我的应用程序中对它们进行排序。
  3. 地理问题:有没有办法将距离(无论是英里、公里)转换为纬度和经度使用的单位吗?这如果用于半径问题。
4

2 回答 2

0
  1. Math.Pow应该由实体框架映射到sql中的相应方法。
  2. 如果 1. 不应该为真,只需通过乘法自己计算幂,这将在数据库中执行
  3. 我没有足够的知识来回答这个问题,但如果我没记错的话,由于地球的形状(取决于参考系和实际距离),这将是相当困难的。
于 2010-12-29T04:03:54.263 回答
0
  1. 它可能已映射到,POWER但您必须尝试并确定。

  2. 如果它不能转换为 SQL,只需更改Math.Pow(someExpression, 2)someExpression * someExpression. 那肯定会在数据库上执行。

  3. 您无法以这种方式使用经度和纬度计算距离。地球表面的事物与笛卡尔平面中的事物不同。

于 2010-12-29T04:09:37.430 回答