Мое приложение - это клиент-серверная установка, где клиент запрашивает у серверов объекты в данном регионе. Он отправит серверу координаты 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 #.