エンティティフレームワーク-空間データ型

空間タイプのサポートは、Entity Framework 5で導入されました。クエリで空間データを分析できるようにするために、一連の演算子も含まれています。たとえば、クエリは2つの地理的な場所の間の距離に基づいてフィルタリングできます。

  • Entity Frameworkを使用すると、新しい空間データ型をクラスのプロパティとして公開し、データベースの空間列にマップできます。

  • また、データベースで実行された空間計算に基づいて、空間演算子を使用してフィルター処理、並べ替え、およびグループ化を行うLINQクエリを作成することもできます。

2つの主要な空間データタイプがあります-

  • 地理データタイプには、GPSの緯度と経度の座標などの楕円体データが格納されます。

  • ジオメトリデータ型は、ユークリッド(フラット)座標系を表します。

次のクリケット場の例を見てみましょう。

Step 1 − [ファイル]→[新規]→[プロジェクト]メニューオプションから新しいプロジェクトを作成します。

Step 2 −左側のペインで、コンソールアプリケーションを選択します。

Step 3 −プロジェクト名を右クリックし、[NuGetパッケージの管理…]を選択します。

Step 4 − EntityFrameworkをインストールします。

Step 5 − System.Data.Entityアセンブリへの参照を追加し、空間データ型のSystem.Data.Spatialusingステートメントも追加します。

Step 6 −Program.csファイルに次のクラスを追加します。

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

Step 7 −エンティティの定義に加えて、DbContextから派生し、DbSet <TEntity>プロパティを公開するクラスを定義する必要があります。

Program.csにコンテキスト定義を追加します。

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

Step 8 −次のコードをMain関数に追加します。これにより、2つの新しいCricketGroundオブジェクトがコンテキストに追加されます。

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

空間プロパティは、DbGeography.FromTextメソッドを使用して初期化されます。WellKnownTextとして表される地理ポイントがメソッドに渡され、データが保存されます。その後、CricketGroundオブジェクトは、その場所が指定された場所に最も近い場所で取得されます。

上記のコードを実行すると、次の出力が返されます。

The closest Cricket Ground to you is: Marghazar Stadium

理解を深めるために、上記の例を段階的に実行することをお勧めします。