2012-05-10 57 views
0

好的,這是我的問題。我有數據庫表BloodCenters,其中有latitudelongitude字段。我想通過使用Linq Lambda Syntax通過檢索相對於某點的給定半徑內的BloodCenters來查詢這些表。如何在Lambda .NET中調用用戶定義函數語法

我使用此代碼,但它仍然給我的錯誤(如果謂詞中):

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; 
} 
+1

緯度和經度'int'的? –

+0

你應該嘗試使用sql server空間數據類型而不是一些託管代碼函數 –

回答

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; 

當然,獲取所有的記錄是不是最好的主意要麼,但有時也有根本別無退路。

您可以嘗試的是在Where謂詞內嵌入Util.distance的邏輯。如果只用「簡單」操作(如基本數學)就可以表達邏輯,則查詢表面將能夠將其轉換爲SQL,一切都將順利進行。

Here是可以自動轉換爲SQL的所有方法的列表。

+0

感謝您的解釋。不幸的是我沒有在你的鏈接上看到任何三角函數。我通過給出'Util.Distance'實現的細節來編輯我的問題。 –

0

您必須將DBEntities().BloodCenters轉換爲IEnumerableList或本地存儲的其他東西。 Linq to SQL將C#轉換爲SQL - 因此您只能使用由SQL Server提供的函數。

另一種方法是模擬與翻譯語句的功能,或在數據庫實現它(存儲過程或類似)

相關問題