1

Entity Framework を使用して、geom データ型で sqlite 交差クエリを実行することは可能ですか?

以下の SQLiteConnection で成功しました ( 「libspatialite-4.dll」をロードした後)

string query = @"SELECT * FROM Spatial_Table WHERE intersects(Geom, GeomFromText('LINESTRING (-69.929201602936 23.577301964831, -20.358889102936 37.730080532218, 4.6020483970643 55.586555530742)', 4326)) = 1"

EF を使用して、SQLite データベースから非空間データをクエリすることに成功しました。

このタイプのクエリは可能ですか? dll を読み込めますか?

どうもありがとう

4

2 に答える 2

4

私が知っているパーティーには少し遅れていますが(これを見つけたばかりです)、受け入れられた答えは厳密には真実ではありません。

本当のことは、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 で追加されたと思います) があることもわかります。戻る。

于 2013-02-24T00:41:29.327 に答える
3

残念だけど違う。

System.Data.SQLite プロバイダーもdevArtの dotConnect for SQLite プロバイダーも、現時点では空間 (Geometry、Geography) 型をサポートしていません。

于 2012-12-18T19:01:40.827 に答える