2012-05-10 17 views
0

これは私の問題です。私はlatitudelongitudeフィールドを持つデータベーステーブルBloodCentersを持っています。私はLinq Lambda Syntaxを使って、ある点を基準にして与えられた半径の内側にあるBloodCentersを検索して、これらの表を照会したいと思います。ラムダ.NETでユーザ定義関数を呼び出す方法

私はこのコードを使用していますが、それはまだ私に(ここで述語内)エラーを与える:

public static List<BloodCenter> GetAllNearby(int latitude, int longitude, int radius, int limit){ 
    List<BloodCenter> res = null; 
    res = new DBEntities().BloodCenters.Where(b => 
     Util.distance(latitude, longitude, b.Latitude, b.Longitude, "K") <= radius).Take(limit); 
    return res; 
} 

Util.distanceは、緯度と経度の2点間の距離を返す関数です。 編集 したがって、私自身の関数をWhere述部の中に入れることはできません。しかし、SQL構文を使って距離を計算することはできますか?ここに私のUtil.Distance実装です:Util.distanceは、あなたのC#コードで実装され、クエリの表面はそれがSQLに変換される方法は考えていない(またはそれが可能である場合でも)ので動作しません

public static double distance(double lat1, double longi1, double lat2, double longi2, string unit){ 
    var theta = longi1 - longi2; 
    var dist = Math.Sin(DegreeToRadian(lat1)) * Math.Sin(DegreeToRadian(lat2)) + 
     Math.Cos(DegreeToRadian(lat1)) * Math.Cos(DegreeToRadian(lat2)) * Math.Cos(DegreeToRadian(theta)); 
    dist = Math.Acos(dist); 
    dist = RadianToDegree(dist); 
    var miles = dist * 60 * 1.1515; 
    unit = unit.ToUpper(); 
    if (unit.Equals("K")) 
     return miles * 1.609344; 
    else if (unit.Equals("N")) 
     return miles * 0.8684; 
    else 
     return miles; 
} 
+1

'int'年代として緯度と経度? –

+0

いくつかのマネージコード関数の代わりにSQL Server空間データ型を使用してください。 –

答えて

1

当面の回避策は、このように、データベースからすべてのレコードを取得し、インスタンスに述語を適用することです。もちろん

res = new DBEntities().BloodCenters.ToList() 
      .Where(b => Util.distance(latitude, longitude, b.Latitude, b.Longitude, "K") <= radius) 
      .Take(limit); 
return res; 

すべてのレコードをフェッチするのいずれか最高のアイデアではなく、単にあります他に方法はありません。

Where述語の内部にUtil.distanceの論理をインライン化することができます。ロジックが「単純な」演算(基本的な数学のような)だけを使って表現できる場合、クエリーサーフェイスはそれをSQLに変換でき、すべてがスムーズに進むでしょう。

Hereは、自動的にSQLに変換できるすべてのメソッドのリストです。

+0

説明をありがとう。残念ながら、私はあなたのリンクに三角法の機能を見ていませんでした。私は 'Util.Distance'実装の詳細を与えて質問を編集しました。 –

0

DBEntities().BloodCentersIEnumerableまたはListまたはローカルに保存されているものに変換する必要があります。 Linq to SQLはC#をSQLに変換するため、SQLサーバーによって提供される関数のみを使用できます。

代替並進ス​​テートメントで機能をシミュレートするか、データベース(ストアドプロシージャまたはそのような)でそれを実現することである

関連する問題