Entity Framework - Type de données spatiales

La prise en charge du type spatial a été introduite dans Entity Framework 5. Un ensemble d'opérateurs est également inclus pour permettre aux requêtes d'analyser les données spatiales. Par exemple, une requête peut filtrer en fonction de la distance entre deux emplacements géographiques.

  • Entity Framework permettra à de nouveaux types de données spatiales d'être exposés en tant que propriétés sur vos classes et de les mapper aux colonnes spatiales de votre base de données.

  • Vous pourrez également écrire des requêtes LINQ qui utilisent les opérateurs spatiaux pour filtrer, trier et regrouper en fonction des calculs spatiaux effectués dans la base de données.

Il existe deux principaux types de données spatiales -

  • Le type de données géographie stocke des données ellipsoïdales, par exemple, les coordonnées GPS de latitude et de longitude.

  • Le type de données geometry représente le système de coordonnées euclidien (plat).

Jetons un coup d'œil à l'exemple suivant de Cricket Ground.

Step 1 - Créer un nouveau projet à partir de l'option de menu Fichier → Nouveau → Projet.

Step 2 - Dans le volet gauche, sélectionnez l'application console.

Step 3 - Cliquez avec le bouton droit sur le nom du projet et sélectionnez Gérer les packages NuGet…

Step 4 - Installez Entity Framework.

Step 5 - Ajoutez une référence à l'assembly System.Data.Entity et ajoutez également l'instruction System.Data.Spatial using pour les types de données spatiales.

Step 6 - Ajoutez la classe suivante dans le fichier Program.cs.

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

Step 7 - En plus de définir des entités, vous devez définir une classe qui dérive de DbContext et expose les propriétés DbSet <TEntity>.

Dans Program.cs, ajoutez la définition de contexte.

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

Step 8 - Ajoutez le code suivant dans la fonction Main, qui ajoutera deux nouveaux objets CricketGround au contexte.

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

Les propriétés spatiales sont initialisées à l'aide de la méthode DbGeography.FromText. Le point géographique représenté par WellKnownText est passé à la méthode, puis enregistre les données. Après cela, l'objet CricketGround sera récupéré là où son emplacement est le plus proche de l'emplacement spécifié.

Lorsque le code ci-dessus est exécuté, vous recevrez la sortie suivante -

The closest Cricket Ground to you is: Marghazar Stadium

Nous vous recommandons d'exécuter l'exemple ci-dessus étape par étape pour une meilleure compréhension.