9

データベースがあり、その中にGPS座標を持つクラスホテルがあります。選択した座標に最も近い場所を取得したい。

私はそれがこのように見えるべきだと思います (私はここで多くのサンプルコードを見つけ、このようなコードを見つけました):

var coord = new GeoCoordinate(latitude, longitude);
var nearest = (from h in db.hotels
               let geo = new GeoCoordinate(h.gps.lat, h.gps.lng)
               orderby geo.GetDistanceTo(coord)
               select h).Take(10);

問題は、何かを検索しようとしたときにこのエラーが発生することです。

LINQ to Entities では、パラメーターなしのコンストラクターと初期化子のみがサポートされています。

私はそれをグーグルで検索しようとしましたが、そのlinqを2つに分割すると役立つことがわかりましたが、方法がわかりません。手伝ってくれてありがとう。

4

3 に答える 3

7

パラメーター化されたコンストラクターの代わりにオブジェクト初期化子を使用できます。

var nearest = (from h in db.hotels
           let geo = new GeoCoordinate{ Latitude = h.gps.lat, Longitude = h.gps.lng}
           orderby geo.GetDistanceTo(coord)
           select h).Take(10);

しかし、GetDistanceTo メソッドが原因で問題が発生する可能性があります。そのメソッドの実装を提供していただけますか?

于 2013-01-18T16:07:06.297 に答える
5

私は、Haversine Distance式のこの実装を使用して、ある程度の成功を収めました。

var startPoint = new { Latitude = 1.123, Longitude = 12.3 };

var closest = entities.Something.OrderBy(x => 12742 * SqlFunctions.Asin(SqlFunctions.SquareRoot(SqlFunctions.Sin(((SqlFunctions.Pi() / 180) * (x.Latitude - startPoint.Latitude)) / 2) * SqlFunctions.Sin(((SqlFunctions.Pi() / 180) * (x.Latitude - startPoint.Latitude)) / 2) +
                                    SqlFunctions.Cos((SqlFunctions.Pi() / 180) * startPoint.Latitude) * SqlFunctions.Cos((SqlFunctions.Pi() / 180) * (x.Latitude)) *
                                    SqlFunctions.Sin(((SqlFunctions.Pi() / 180) * (x.Longitude - startPoint.Longitude)) / 2) * SqlFunctions.Sin(((SqlFunctions.Pi() / 180) * (x.Longitude - startPoint.Longitude)) / 2)))).Take(5);
于 2015-07-27T10:54:08.737 に答える
4

今使用しているソリューションをここに投稿します。しかし、彼が問題の私の問題を解決するので、私はGwynnBlieddの答えを選びます。

クラスにDbGeographyタイプを追加し、データベースに緯度と経度を保存する代わりにそれを使用しています。

locationField = DbGeography.FromText(String.Format("POINT({0} {1})", orig.gps.lat.ToString().Replace(",", "."), orig.gps.lng.ToString().Replace(",", ".")));

次に、linqを使用するのは非常に簡単です。

var coord = DbGeography.FromText(String.Format("POINT({0} {1})", latitude.ToString().Replace(",", "."), longitude.ToString().Replace(",", ".")));
            var nearest = (from h in db.hotels
                           where h.location != null
                           orderby h.location.Distance(coord)
                           select h).Take(limit);
            return nearest;

今のところ、これは実用的なソリューションであり、それは良いことです。しばらくの間、これを使用していましたが、ここで言ったユーザーはほとんどいないので、Haversine式を実装してUDFを試してみます(この回答のように)。

于 2013-01-21T18:43:50.427 に答える