2012-03-20 32 views
3

我目前正在研究基於距離檢索其他用戶位置的應用程序。如何在我的android應用程序的visual C#web服務中的LINQ中調用用戶定義函數?

我有一個數據庫,存儲所有的用戶位置信息的經度和緯度。 由於這兩對經緯度之間的距離計算相當複雜,我需要一個函數來處理它。

from a in db.Location.Where(a => (calDistance(lat, longi, Double.Parse(a.latitude), Double.Parse(a.longitude)))<Math.Abs(distance) )) {...} 

但是,我得到了以下錯誤:LINQ到實體無法識別的方法和這種方法不能被翻譯成店表達。

我不知道如何將它翻譯成商店表達式,而且計算也需要數學庫。

是否有任何方法可以讓LINQ表達式調用我自己的函數?

也許有其他方法可以實現我的目標,任何人都可以幫忙嗎?

回答

0

我真的不KN但是假設你只能在查詢中發送簡單的約束,我會構造一個基本上做calDistance反過來的方法 - 取一個座標和一個距離,並將它轉換成一個最小經度,最大經度的邊界框,最小緯度和最大緯度。

您應該能夠構建一個簡單的查詢,以滿足您的這些約束的目的。

像(使用Java這裏):

public double[] getCoordinateBounds(double distance, double longitude, double latitude) { 
    double[] bounds = new double[4]; 
    bounds[0] = longitude - distanceToLongitudePoints * (distance); 
    bounds[1] = longitude + distanceToLongitudePoints * (distance); 
    bounds[2] = latitude - distanceToLatitudePoints * (distance); 
    bounds[3] = latitude + distanceToLatitudePoints * (distance); 
    return bounds; 
} 

然後,你可以構造一個查詢。

double[] bounds = getCoordinateBounds(distance, longi, lat); 
var nearbyUserLocations = from a in db.Location 
         where longitude > bounds[0] and longitude < bounds[1] 
          and latitude > bounds[2] and latitude < bounds[3] 

這會給你點了一箱,而不是點的半徑,但它是足夠的幾點,你可以再處理它們,扔掉你的半徑範圍之外的人。或者你可能會決定一個盒子可以滿足你的需求。

+0

這個想法聽起來不錯,我會嘗試。非常感謝你 – Chleung49 2012-03-20 16:07:52

+0

不客氣。祝你好運! – 2012-03-20 16:10:52

0

您看到的問題是,LINQ to SQL引擎正試圖從您的用戶定義的函數注入T-SQL,但它不能。一個(雖然討厭)選項是檢索所有的位置,然後從該結果集計算。

var locations = db.Location.ToList(); 
locations = locations.Where(a => (calDistance(lat, longi, Double.Parse(a.latitude), Double.Parse(a.longitude))).ToList(); 
+0

有加載整個表到內存的效果,爆炸 – 2012-03-20 14:58:40

+0

這就是爲什麼我說這是討厭的。 – 2012-03-20 15:13:23

1

LinqToEntities不會讓你調用一個函數,它甚至不容許的ToString()

這不是一個LINQ的東西它是一個LinqToEntities限制

你可以把你的代碼到數據庫的存儲過程或函數,使用調用它ExecuteStoreQuery

看到這裏Does Entity Framework Code First support stored procedures?

相關問題