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. 地理に関する質問: 距離 (マイル、km) を緯度と経度で使用する単位に変換する方法はありますか? これは、半径の問題の場合です。
4

2 に答える 2

0
  1. おそらくにマップされてPOWERいますが、試してみて、確認する必要があります。

  2. SQLに変換されない場合は、に変更Math.Pow(someExpression, 2)してsomeExpression * someExpressionください。それは間違いなくデータベースで実行されます。

  3. このように経度と緯度を使用して距離を計算することはできません。地球の表面とデカルト平面では物事が異なります。

于 2010-12-29T04:09:37.430 に答える
0
  1. Math.Powエンティティ フレームワークによって、SQL の適切なメソッドにマップする必要があります。
  2. 1.が真でない場合は、乗算によって自分で電力を計算してください。これはデータベースで実行されます
  3. 私はその質問に答えるのに十分な知識を持っていませんが、私の記憶が正しければ、これは地球の形のためにかなり難しいでしょう (参照フレームと実際の距離によって異なります)。
于 2010-12-29T04:03:54.263 に答える