Учебники

Entity Framework — Пространственный тип данных

Поддержка пространственных типов была введена в Entity Framework 5. Также включен набор операторов, позволяющих запросам анализировать пространственные данные. Например, запрос может фильтроваться на основе расстояния между двумя географическими точками.

  • Entity Framework позволит новым пространственным типам данных отображаться в виде свойств в ваших классах и отображать их в пространственные столбцы в вашей базе данных.

  • Вы также сможете писать запросы LINQ, использующие пространственные операторы для фильтрации, сортировки и группировки на основе пространственных вычислений, выполненных в базе данных.

Entity Framework позволит новым пространственным типам данных отображаться в виде свойств в ваших классах и отображать их в пространственные столбцы в вашей базе данных.

Вы также сможете писать запросы LINQ, использующие пространственные операторы для фильтрации, сортировки и группировки на основе пространственных вычислений, выполненных в базе данных.

Существует два основных типа пространственных данных:

  • Географический тип данных хранит эллипсоидальные данные, например, координаты широты и долготы GPS.

  • Тип данных геометрии представляет евклидову (плоскую) систему координат.

Географический тип данных хранит эллипсоидальные данные, например, координаты широты и долготы GPS.

Тип данных геометрии представляет евклидову (плоскую) систему координат.

Давайте посмотрим на следующий пример игры в крикет.

Шаг 1 — Создать новый проект из меню Файл → Создать → Проект.

Шаг 2 — На левой панели выберите Консольное приложение.

Крикетный проект

Шаг 3 — Щелкните правой кнопкой мыши на имени проекта и выберите «Управление пакетами NuGet»…

NuGet Project

Шаг 4 — Установите Entity Framework.

Шаг 5. Добавьте ссылку на сборку System.Data.Entity, а также добавьте выражение System.Data.Spatial, используя оператор для пространственных типов данных.

Добавить ссылку

Шаг 6 — Добавьте следующий класс в файл Program.cs.

public class CricketGround {
   public int ID { get; set; }
   public string Name { get; set; }
   public DbGeography Location { get; set; }
}

Шаг 7 — Помимо определения сущностей, вам нужно определить класс, который наследуется от DbContext и предоставляет свойства DbSet <TEntity>.

В Program.cs добавьте определение контекста.

public partial class CricketGroundContext : DbContext {
   public DbSet<CricketGround> CricketGrounds { get; set; }
}

Шаг 8 — Добавьте следующий код в функцию Main, которая добавит два новых объекта CricketGround в контекст.

class Program {

   static void Main(string[] args) {

      using (var context = new CricketGroundContext()) {

         context.CricketGrounds.Add(new CricketGround() {
            Name = "Shalimar Cricket Ground", 
            Location = DbGeography.FromText("POINT(-122.336106 47.605049)"), 
         });

         context.CricketGrounds.Add(new CricketGround() {
            Name = "Marghazar Stadium", Location = DbGeography
               .FromText("POINT(-122.335197 47.646711)"), 
         });

         context.SaveChanges();

         var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)");

         var cricketGround = (from cg in context.CricketGrounds
            orderby cg.Location.Distance(myLocation) select cg).FirstOrDefault();

         Console.WriteLine("The closest Cricket Ground to you is: {0}.", cricketGround.Name);
      }
   }
}

Пространственные свойства инициализируются с использованием метода DbGeography.FromText. Географическая точка, представленная как WellKnownText, передается методу, а затем сохраняет данные. После этого объект CricketGround будет извлечен там, где его местоположение находится ближе всего к указанному местоположению.

Когда приведенный выше код будет выполнен, вы получите следующий вывод:

The closest Cricket Ground to you is: Marghazar Stadium

Мы рекомендуем вам выполнить вышеприведенный пример пошагово для лучшего понимания.