Estrutura da entidade - tipo de dados espaciais

O suporte ao tipo espacial foi introduzido no Entity Framework 5. Um conjunto de operadores também está incluído para permitir consultas para analisar dados espaciais. Por exemplo, uma consulta pode filtrar com base na distância entre duas localizações geográficas.

  • O Entity Framework permitirá que novos tipos de dados espaciais sejam expostos como propriedades em suas classes e os mapeie para colunas espaciais em seu banco de dados.

  • Você também será capaz de escrever consultas LINQ que usam os operadores espaciais para filtrar, classificar e agrupar com base em cálculos espaciais executados no banco de dados.

Existem dois tipos principais de dados espaciais -

  • O tipo de dados geográficos armazena dados elipsoidais, por exemplo, coordenadas de latitude e longitude do GPS.

  • O tipo de dados de geometria representa o sistema de coordenadas euclidianas (planas).

Vamos dar uma olhada no seguinte exemplo de campo de críquete.

Step 1 - Crie um novo projeto a partir da opção de menu Arquivo → Novo → Projeto.

Step 2 - No painel esquerdo, selecione o aplicativo de console.

Step 3 - Clique com o botão direito no nome do projeto e selecione Gerenciar Pacotes NuGet ...

Step 4 - Instale o Entity Framework.

Step 5 - Adicionar referência ao assembly System.Data.Entity e também adicionar System.Data.Spatial using a instrução para tipos de dados espaciais.

Step 6 - Adicione a seguinte classe no arquivo Program.cs.

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

Step 7 - Além de definir entidades, você precisa definir uma classe que deriva de DbContext e expõe as propriedades DbSet <TEntity>.

Em Program.cs adicione a definição de contexto.

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

Step 8 - Adicione o seguinte código à função principal, que adicionará dois novos objetos CricketGround ao contexto.

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);
      }
   }
}

As propriedades espaciais são inicializadas usando o método DbGeography.FromText. O ponto geográfico representado como WellKnownText é passado para o método e salva os dados. Depois disso, o objeto CricketGround será recuperado onde sua localização for mais próxima da localização especificada.

Quando o código acima for executado, você receberá a seguinte saída -

The closest Cricket Ground to you is: Marghazar Stadium

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.