2011-01-21 50 views
1

我的應用程序是客戶端 - 服務器設置,客戶端向服務器請求服務器查找給定區域中的對象。它將發送服務器的x和y座標以及半徑。然後,服務器必須在SQL Server數據庫中查詢指定區域中的對象。在數據庫中,對象按其x和y座標存儲。Linq to SQL中的簡單程序

首先我嘗試了contains方法中的Region對象通過WCF傳遞給服務器。那麼,當然這不起作用,因爲它不能將該方法轉換爲T-SQL。但我見過在LINQ查詢中使用簡單的lambda表達式,所以我想這:

 Func<UniverseStationaryObject, RegionLocation, bool> contains = 
     (universeObject, location) => Math.Sqrt(
      Math.Pow(universeObject.locationX - location.x, 2) + 
      Math.Pow(universeObject.locationY - location.y, 2) 
      ) <= location.radius; 

     var objects = from o in dataContext.UniverseStationaryObjects 
         where contains.Invoke(o, Location) 
         select o; 

不幸的是,這並沒有工作,要麼 - 我已閱讀,一些功能在允許的LINQ到SQL查詢,但我猜數學功能不在其中?我需要一個存儲的功能嗎?存儲的函數會是什麼樣子(我從來沒有在T-SQL中寫過)?我可以將C#對象傳遞給函數,並避免提取每個值傳遞給數據庫服務器?我的意思是,當我將存儲的函數添加到linq-to-sql類設計器時,我可以讓它接受一個對象並提取這個值嗎?

請注意,它不是一個檢索每個對象並在C#中篩選它們的選項。

回答

1

您需要使用System.Data.Linq.CompiledQuery.Compile()編制一個編譯查詢。它需要對您的查詢進行一些修改才能使其工作。我相信,像這樣的工作:

Func<MyDataContext, UniverseStationaryObject, RegionLocation, bool> contains = 
    CompiledQuery.Compile(
     (MyDataContext dc, UniverseStationaryObject universeObject, RegionLocation location) => 
      Math.Sqrt(
       Math.Pow(universeObject.locationX - location.x, 2) + 
       Math.Pow(universeObject.locationY - location.y, 2) 
      ) <= location.radius); 

var objects = from o in dataContext.UniverseStationaryObjects 
       where contains(dataContext, o, Location) 
       select o; 

參見:Creating reusable chunks of LINQ to SQL

+0

哦,爽:)可惜我繼續和學會了如何使存儲的功能已經:(但我要試試這個太 – 2011-01-21 04:38:41