私が知っているパーティーには少し遅れていますが(これを見つけたばかりです)、受け入れられた答えは厳密には真実ではありません。
本当のことは、EF にはこれをサポートする Geometry や Geography 型がないということですが、それを回避する方法はあります。
最初に...
次のように、データベース コンテキストで ExecuteSqlCommand を使用して拡張 DLL をロードできます。
_ctx.Database.ExecuteSqlCommand(@"SELECT load_extension('libspatialite-4.dll')");
次に、Geometry をテキストではなくバイナリとして返す場合、DB から通常のデータとして戻すことができます。
byte[]
データ・タイプ。これは、NuGet を熟知して「.NET トポロジ スイート」(略して NTS) をインストールするまでは、少し逆効果に思えるかもしれません。
これらのバイナリ配列を NTS に入力すると、ジオメトリを表すファースト クラスの .NET オブジェクトが構築されて返されます。NTS には、基本的に Spatialite に含まれるすべてのものが含まれていますが、C# アセンブリに含まれています。実際、NTSを使用すると、実際にはspatialiteは必要ありません。データベースとの間でバイナリ配列を保存および取得し、純粋に独自のコードで操作できます。
そのようにして失われる唯一のものは、SQL のような select ステートメントを実行して、DB からジオメトリを検索する機能です。
しかし、恐れることはありません....
そのために、結果を次のような通常の地理的テキスト オブジェクトとしてコードに返すことができます。
POINT(1 2)
また
LINE(1 2,3 4,5 6,7 8)
あなたがする必要があるのは、Spatialitesの「AsText」関数を介して結果を渡すことによって、実行するSQLクエリの結果がその出力を作成することを確認することだけです.
あなたの例を使用するには
string query = @"SELECT col1,col2,col3,AsText(GeometryColumn) FROM Spatial_Table WHERE intersects(Geom, GeomFromText('LINESTRING (-69.929201602936 23.577301964831, -20.358889102936 37.730080532218, 4.6020483970643 55.586555530742)', 4326)) = 1"
次のようなものが生成されます。
1,2,3,POINT(1 2)
4,5,6,POINT(3 4)
1,2,3,POINT(1 2)
4,5,6,POINT(3 4)
次のように、通常の .NET オブジェクトにフィードできます。
public class myclass
{
public int col1 { get; set; }
public int col2 { get; set; }
public int col3 { get; set; }
public string GeometryColumn { get; set; }
}
繰り返しになりますが、NTS を使用すると、NTS はテキスト文字列で Spatialite から渡されたものを解析してグラフィック オブジェクトに変換できます。
私の会社は、これらの手法を主力製品の 1 つで非常に確実に使用しており、EF 4.3 から使用しています。
ExecuteSqlCommand は EF5 に登場したばかりですが、以前のバージョンでは任意の SQL ステートメントを実行する同様の方法が他にもありました。
また、エンティティ テーブルには、特定のテーブルでデータ リーダー スタイルのクエリを実行し、厳密に型指定されたモデルを利用してデータを取得できる SqlQuery という新しい関数 (EF5 で追加されたと思います) があることもわかります。戻る。