2011-01-21 2 views
1

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

Сначала я пробовал метод 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 для запросов SQL , но я думаю, что математические функции не среди них? Мне нужна хранимая функция для этого? Как выглядит хранимая функция (я никогда не писал ее в T-SQL)? Могу ли я передавать объекты C# в функции и не извлекать каждое значение для перехода на сервер db? Я имею в виду, когда я добавляю хранимые функции в конструктор классов 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

ооо, круто :) к сожалению, я пошел вперед и узнал, как сделать хранимую функцию уже :(, но я собираюсь попробовать это слишком –

 Смежные вопросы

  • Нет связанных вопросов^_^