1

我的应用程序是客户端-服务器设置,客户端向服务器询问给定区域中的对象。它将向服务器发送 x 和 y 坐标以及半径。然后,服务器必须在 SQL Server 数据库中查询指定区域中的对象。在数据库中,对象由它们的 x 和 y 坐标存储。

首先,我在通过 WCF 传递给服务器contains的对象中尝试了一个方法。Region好吧,这当然不起作用,因为它无法将方法转换为 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 to SQL 查询中允许使用某些函数,但我猜数学函数不在其中?我需要一个存储功能吗?存储的函数会是什么样子(我从未在 T-SQL 中编写过)?我可以将 C# 对象传递给函数并避免提取每个值以传递给数据库服务器吗?我的意思是,当我将存储的函数添加到 linq-to-sql 类设计器时,我可以让它接受一个对象并在那时提取值吗?

请注意,检索每个对象并在 C# 中过滤它们不是一个选项。

4

1 回答 1

1

您需要contains()使用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;

另请参阅:创建可重用的 LINQ to SQL 块

于 2011-01-21T04:36:37.243 回答