これは私の問題です。私はlatitude
とlongitude
フィールドを持つデータベーステーブル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;
}
'int'年代として緯度と経度? –
いくつかのマネージコード関数の代わりにSQL Server空間データ型を使用してください。 –