0

わかりました、これが私の問題です。とフィールドを持つデータベーステーブルBloodCentersがあります。Linq Lambda 構文を使用してこれらのテーブルをクエリし、特定のポイントから指定された半径内にある BloodCenters を取得します。latitudelongitude

私はこのコードを使用していますが、それでもエラーが発生します (Where 述語内):

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実装です:

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;
}
4

2 に答える 2

1

Util.distanceはC#コードに実装されており、クエリサーフェスはそれがSQLにどのように変換されるか(またはそれが可能であっても)わからないため、これは機能しません。

即時の回避策は、データベースからすべてのレコードをフェッチし、次のように述語をインスタンスに適用することです。

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

もちろん、すべてのレコードをフェッチすることも最善の方法ではありませんが、他の方法がない場合もあります。

試すことができるのは、述語Util.distance内のロジックをインライン化することです。Whereロジックを「単純な」操作(基本的な数学など)のみを使用して表現できる場合、クエリサーフェスはそれをSQLに変換でき、すべてがスムーズに進みます。

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

于 2012-05-10T12:39:07.120 に答える
0

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

別の方法は、翻訳可能なステートメントで関数をシミュレートするか、データベースで実装することです (ストアド プロシージャなど)。

于 2012-05-10T12:44:26.633 に答える