Entity Framework - Tipo di dati spaziali

Il supporto del tipo spaziale è stato introdotto in Entity Framework 5. È incluso anche un set di operatori per consentire alle query di analizzare i dati spaziali. Ad esempio, una query può filtrare in base alla distanza tra due località geografiche.

  • Entity Framework consentirà di esporre nuovi tipi di dati spaziali come proprietà nelle classi e di mapparli alle colonne spaziali nel database.

  • Sarai anche in grado di scrivere query LINQ che fanno uso degli operatori spaziali per filtrare, ordinare e raggruppare in base a calcoli spaziali eseguiti nel database.

Esistono due principali tipi di dati spaziali:

  • Il tipo di dati geography memorizza i dati ellissoidali, ad esempio, le coordinate di latitudine e longitudine GPS.

  • Il tipo di dati della geometria rappresenta il sistema di coordinate euclideo (piatto).

Diamo uno sguardo al seguente esempio di campo da cricket.

Step 1 - Crea nuovo progetto da File → Nuovo → opzione di menu Progetto.

Step 2 - Nel riquadro di sinistra, seleziona l'applicazione Console.

Step 3 - Fare clic con il pulsante destro del mouse sul nome del progetto e selezionare Gestisci pacchetti NuGet ...

Step 4 - Installa Entity Framework.

Step 5 - Aggiungere il riferimento all'assembly System.Data.Entity e anche l'istruzione using System.Data.Spatial per i tipi di dati spaziali.

Step 6 - Aggiungere la seguente classe nel file Program.cs.

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

Step 7 - Oltre a definire le entità, è necessario definire una classe che deriva da DbContext ed espone le proprietà DbSet <TEntity>.

In Program.cs aggiungere la definizione del contesto.

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

Step 8 - Aggiungi il seguente codice nella funzione Main, che aggiungerà due nuovi oggetti CricketGround al contesto.

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

Le proprietà spaziali vengono inizializzate utilizzando il metodo DbGeography.FromText. Il punto geografico rappresentato come WellKnownText viene passato al metodo e quindi salva i dati. Dopodiché l'oggetto CricketGround verrà recuperato dove la sua posizione è più vicina alla posizione specificata.

Quando il codice sopra viene eseguito, riceverai il seguente output:

The closest Cricket Ground to you is: Marghazar Stadium

Si consiglia di eseguire l'esempio precedente in modo graduale per una migliore comprensione.