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 回答