0

Xamarin で SQLite.NET パッケージを使用してクエリを作成しようとしています。

public static List<Place> searchForPlace(double lat, double lng)
{
    var query = conn.Table<GPSPoint>().Where(v => Math.Sqrt(Math.Pow(v.lat - lat, 2) - Math.Pow(v.lng - lng, 2)) < 5);

    List<Place> l = new List<Place>();

    foreach (var gpsPoint in query) // the foreach statement causes the error System.NotSupportedException: Cannot get SQL for: Subtract
    {
        var queryPlaces = conn.Table<Place>().Where(v => v.ID == gpsPoint.ID);
        foreach (var place in queryPlaces)
            l.Add(place);
        break;
    }
    return l;
}

しかし、私のコードではこのエラーが発生しますSystem.NotSupportedException: Cannot get SQL for: Subtract

これは、データベースの初期化に使用するコードです

public DatabaseConnection()
{
    string folder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    conn = new SQLiteConnection(System.IO.Path.Combine(folder, "navigationApp.db"));
    conn.CreateTable<GPSPoint>();
    conn.CreateTable<Place>();
}

何が問題で、どうすれば解決できますか?

4

1 に答える 1

1

問題は where 句にあります。

   var query = conn.Table<GPSPoint>().Where(v => Math.Sqrt(Math.Pow(v.lat - lat, 2) - Math.Pow(v.lng - lng, 2)) < 5);

LINQ To Sql はこの式を評価するため、Math.Sqrt、Math.Pow、およびSubtractも評価しようとします。この方法では SQL で計算を実行できないため、データをロードしてから評価する必要があります。

これは可能な解決策です。おそらく、事前にいくつかのポイントを整理するために別の bool 句を定義できます。

var gpsPoints = conn.Table<GPSPoint>();
var validPoints = gpsPoints.Where(v => Math.Sqrt(Math.Pow(v.lat - lat, 2) - Math.Pow(v.lng - lng, 2)) < 5);
于 2016-08-15T10:02:50.577 に答える