2011-01-21 63 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