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.