エンティティフレームワーク-空間データ型
空間タイプのサポートは、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
理解を深めるために、上記の例を段階的に実行することをお勧めします。