Простые процедуры в Linq To SQL - PullRequest
1 голос
/ 21 января 2011

Мое приложение - это клиент-серверная установка, где клиент запрашивает у серверов объекты в данном регионе. Он отправит серверу координаты x и y и радиус. Затем сервер должен запросить базу данных SQL Server для объектов в указанном регионе. В базе данных объекты хранятся по их координатам x и y.

Сначала я попробовал метод contains в объекте Region, переданном на сервер через WCF. Ну, конечно, это не сработало, потому что он не мог конвертировать метод в T-SQL. Но я видел простые лямбда-выражения, используемые в запросах linq, поэтому я попробовал это:

        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 #.

1 Ответ

1 голос
/ 21 января 2011

Вам нужно будет сделать 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

...