2012-03-18 46 views
1

我已存儲的數據庫功能,用於計算最近的位置:如何通過功能NHibernate調用數據庫存儲功能,並獲得IQueryable的<T>作爲結果

CREATE FUNCTION LoadNearBusinesses 
    (
     @latitude DECIMAL(25, 10), 
     @longtitude DECIMAL(25, 10), 
     @areaRadius DECIMAL(25, 10) 
    ) 
    RETURNS TABLE 
    AS 
    return SELECT DISTINCT [Business].* FROM [Business] 
    LEFT JOIN [BusinessLocation] ON [BusinessLocation].Business_id = [Business].Id 
    LEFT JOIN [Location] ON [BusinessLocation].Id = [Location].Id 
    WHERE 6371 * ACos(COS(@latitude* PI()/180) * Cos([Location].Latitude * PI()/180) * Cos(([Location].Longitude- @longtitude)* PI()/180) + SIN(@latitude* PI()/180) * Sin([Location].Latitude* PI()/180)) <= @areaRadius; 

現在我需要從我的代碼調用這個函數,並得到IQueryable < 業務>作爲在遠程網格中使用它的結果。

我嘗試:

Session.CreateSQLQuery(
       string.Format(@"SELECT * FROM [dbo].[LoadNearBusinesses]({0},{1},{2})", 
       latitude, longitude, radius)).AddEntity(typeof(Business)).List<Business>(); 

但這是列表,當我添加額外的過濾會在內存中執行,而不是數據庫。

你有什麼想法嗎?謝謝。

回答

0

這應該給你一個IQueryable<Business>使用與存儲過程相同的邏輯。你需要一個參考NHibernete.Linq這個工作。

int latitude = 1; 
int longitude = 2; 

var q = from business in session.Query<Business>() 
     join businessLocation in session.Query<BusinessLocation>() 
      on business.Id equals businessLocation.Business_Id into busBusLoc 
     from subBusiness in busBusLoc.DefaultIfEmpty() 
     join location in session.Query<Location>() 
      on businessLocation.Id equals location.Id into busBusLocLoc 
     from subBusinessLocationLocation in busBusLocLoc.DefaultIfEmpty() 
     where (6371 * Math.Acos(Math.Cos(latitude * Math.PI/180) 
        * Math.Cos(l.Latitude * Math.PI/180) 
        * Math.Cos((l.Longitude - longtitude) * Math.PI/180) 
         + Math.Sin(latitude * Math.PI/180) 
         * Math.Sin(location.Latitude * Math.PI/180))) 
       <= areaRadius 
     select business; 

當然,通常你的ORM只會通過內部連接關聯實體,所以你必須在這裏手動執行左邊的連接。 whereselect應該是非常簡單的。

+0

謝謝您的回答,但LINQ到NHibernate的不支持Math.Acos,Math.Cos功能 – pryabov 2012-08-28 18:37:41

0

你可以面對@SteveMallory查詢(我認爲是正確的做法)的一個問題是Linq到NHibernate不支持數學三角函數,但它支持擴展自己:)。

檢查這兩個環節來解決這個問題: http://fabiomaulo.blogspot.mx/2010/07/nhibernate-linq-provider-extension.htmlhttps://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate.Test/Linq/CustomExtensionsExample.cs

+0

謝謝您的回答。但是因爲我沒有理解使用Fluent Nhibernate處理存儲函數的「傳統」方式 – pryabov 2012-08-28 18:40:19