Как использовать DbGeography.Filter в Linq с Entity Framework 5?

В Entity Framework 5 можно использовать пространственные процедуры SQL Server в запросах Linq.

Например, используя объект DbGeography, вы можете использовать метод «Buffer()», который преобразуется в STBuffer в SQL Server. Точно так же Intersects() преобразуется в STIntersects.

Это пример запроса, который работает:

  var point = DbGeography.FromText(string.Format("POINT({1} {0})", latitude, longitude), 4326);
  var query = from person in persons
              let region = point.Buffer(radius)
              where person.Location.Intersects(region)
              select person;

Я хотел бы использовать возможность Фильтр (поскольку это может ускорить ваши запросы, если точность не является вашей главной задачей, как указано здесь: http://www.pauldmendoza.com/post/SQL-Server-Filter-vs-STInterects.aspx) Однако, Я не могу найти, как это сделать в EF5. Это возможно? И если да: как?

Я использую SQL Server 2008 R2.


person Bas de Raad    schedule 20.01.2014    source источник


Ответы (1)


Слишком рано задал вопрос. Я нашел это: http://msdn.microsoft.com/en-us/library/hh673622(v=vs.110).aspx

И это можно использовать так:

  var point = DbGeography.FromText(string.Format("POINT({1} {0})", latitude, longitude), 4326);
  var query = from person in persons
              let region = point.Buffer(radius)
              where SqlSpatialFunctions.Filter(person.Location, region) == true
              select person; 

И это переводится в запрос, который я хотел.

person Bas de Raad    schedule 20.01.2014
comment
Просто быстрое примечание: «POINT» ожидает первую долготу, а не широту. - person ITmeze; 14.05.2014
comment
Это правда, но я добавил {1} перед {0}, поэтому пример правильный. - person Bas de Raad; 15.05.2014
comment
не заметил такого - person ITmeze; 16.05.2014
comment
каково будет оптимальное значение радиуса? - person Mostafa; 27.05.2016