Entity Framework: tipo de datos espaciales

El soporte de tipo espacial se introdujo en Entity Framework 5. También se incluye un conjunto de operadores para permitir que las consultas analicen datos espaciales. Por ejemplo, una consulta puede filtrar en función de la distancia entre dos ubicaciones geográficas.

  • Entity Framework permitirá que se expongan nuevos tipos de datos espaciales como propiedades en sus clases y los mapee a columnas espaciales en su base de datos.

  • También podrá escribir consultas LINQ que hagan uso de los operadores espaciales para filtrar, ordenar y agrupar en función de los cálculos espaciales realizados en la base de datos.

Hay dos tipos principales de datos espaciales:

  • El tipo de datos geográficos almacena datos elipsoidales, por ejemplo, coordenadas GPS de latitud y longitud.

  • El tipo de datos de geometría representa el sistema de coordenadas euclidiano (plano).

Echemos un vistazo al siguiente ejemplo de Cricket Ground.

Step 1 - Crear nuevo proyecto desde Archivo → Nuevo → Opción de menú Proyecto.

Step 2 - En el panel izquierdo, seleccione la Aplicación de consola.

Step 3 - Haga clic con el botón derecho en el nombre del proyecto y seleccione Administrar paquetes NuGet ...

Step 4 - Instalar Entity Framework.

Step 5 - Agregue una referencia al ensamblado System.Data.Entity y también agregue la declaración de uso System.Data.Spatial para los tipos de datos espaciales.

Step 6 - Agregue la siguiente clase en el archivo Program.cs.

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

Step 7 - Además de definir entidades, debe definir una clase que se derive de DbContext y exponga las propiedades de DbSet <TEntity>.

En Program.cs agregue la definición de contexto.

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

Step 8 - Agrega el siguiente código en la función Main, que agregará dos nuevos objetos CricketGround al 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);
      }
   }
}

Las propiedades espaciales se inicializan mediante el método DbGeography.FromText. El punto geográfico representado como WellKnownText se pasa al método y luego guarda los datos. Después, el objeto CricketGround se recuperará donde su ubicación sea más cercana a la ubicación especificada.

Cuando se ejecuta el código anterior, recibirá el siguiente resultado:

The closest Cricket Ground to you is: Marghazar Stadium

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.