2016-08-15 76 views
0

我想用Xamarin上的SQLite.NET軟件包進行查詢。無法獲取SQL:減

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>(); 
} 

有什麼問題,我怎麼能解決它的代碼?

回答

0

問題出在你的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和減去。您需要加載數據並對其進行評估,因爲您無法以這種方式在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); 
+0

你的代碼,使我的錯誤'TableQuery 不包含「ToList」,沒有擴展方法「ToList」接受一個類型的第一個參數「TableQuery 」的定義可以found' –

+0

您需要調用ToList()'帶有一個泛型參數,我猜。 'ToList ()'; –

+0

我根本無法調用'ToList'方法。 [這種方法沒有定義](http://imgur.com/LAMZAgp)。 –