LinqToSQLまたはEntityFrameworkv4のVS2010リリースがSQL2008空間データ型を介したクエリをサポートするかどうかを(理想的には参照して)誰かが知っていますか?
3 に答える
Entity Framework / LINQtoEntitiesで機能させるための回避策は次のとおりです。
データベースビューを使用して、Well-Known-Text(クエリで "geometry.ToString()"を使用)またはバイナリを返すことができます。次に、結果の行が返されたら、文字列/バイナリを.NETのSqlGeometryオブジェクトに変換するだけです。
ジオメトリタイプの「場所」フィールドをWell-Known-Text文字列に変換するビューを作成するために使用されるサンプルクエリを次に示します。
SELECT ID, Name, Location.ToString() as Location FROM MyTable
次に、「geography」オブジェクトのWell-Known-TextまたはString表現を含む「Location」フィールドを持つ結果のエンティティをクエリする例を示します。
var e = new MyApp.Data.MyDataEntities(connectionString);
var items = from i in e.MyTables
select i;
foreach (var i in items)
{
// "Location" is the geography field
var l = SqlGeography.Parse(i.Location);
var lat = l.Lat;
var lng = l.Long;
}
もう1つ、LINQを使用して独自の空間クエリを実行するために、テーブルから.NETにすべてのデータをプルする必要がないため、ストアドプロシージャ内で空間ベースのクエリを実行する必要があります。
これは、SQL Spatialタイプをネイティブにサポートするほど効率的ではありませんが、EntityFrameworkとSQLSpatialを同時に実行できるようになります。
EF 4.0では、カスタム関数の組み合わせを使用して何かを一緒にハックすることができ、空間型が実際にはバイナリ型であるかのように見せかけることができる場合があります。これは、私がいじくり回して試してみて、ヒントシリーズに追加することを考えているものです。しかし、まだハックでさえ証明されていません。:(
また、直接サポートに関しては、残念ながら、L2SもEFv4もVS2010タイムフレームで空間タイプをサポートしません。
EntityFrameworkプログラムマネージャー。
また、手書きのテーブルと列を使用してLinq-to-SQLを実行し、SQL空間型を直接取得することもできます。サンプルDBで以下をテストしました(System.SqlServer.Typesへの参照と「使用」を含めることを忘れないでください
..。
string connectionString = @"Data Source=YADDAYADDA;Initial Catalog=MUMBLEMUMBLE;Integrated Security=True";
var pointsFileDc = new PointsFileDC(connectionString);
var geos = (from point in pointsFileDc.pointsData
select point).Take(10);
foreach (var geo in geos)
{
ObjectDumper.Write(geo);
}
..。
public class PointsFileDC : DataContext
{
public Table<GeoPoints> pointsData;
public PointsFileDC(string connection)
: base(connection)
{
}
}
[Table(Name = "Points")]
public class GeoPoints
{
[Column(IsPrimaryKey = true)]
public int PointId;
[Column]
public SqlGeography GeoPoint;
}