2009-08-21 9 views

答えて

11

EF 4.0では、custom functionsの組み合わせを使用して何かをハックすることができ、空間タイプが実際にバイナリタイプであると思われる場合があります。これは、私が周りを試して試してみて、my tips seriesに追加することを考えているものです。しかし、まだハックさえ証明されていません。 :(

そして直接支援のためとして、残念ながらL2SやEFどちらV4はVS2010の時間枠内での空間タイプをサポートします。

Alex James

Entity Frameworkのプログラムマネージャ。

+0

おかげでアレックス...「の参照を含めることを忘れと 'いけない(サンプルDBに以下のSystem.SqlServer.Types

に' を使用してテストしました確かに、信頼性の高い決定的な答えのように思えます。EF4がそれらをサポートしないという特別な理由はありますか(あまりにも難しく、需要が足りない、優先度が低すぎます...) –

+2

さて、あまりにも低い優先順位を言いません。私はそれを最優先と考えていますが、POCO、F KS、モデルファーストなど –

+2

EFはいつ空間型サポートを取得しますか? VS'2012;彼らはSQL Serverに追加された後わずか4年?? –

24

はここで取得するための回避策ですEntity Framework/LINQ to Entities:

データベースビューを使用して、Well-Known-Text(クエリの "geometry.ToString()"を使用)またはバイナリを返すことができます。行が返されます。文字列/バイナリを.NETのSqlGeometryオブジェクトに変換します。ここで

は、よく知られたテキスト文字列にジオメトリタイプの「場所」フィールドに変換ビューを構築するために使用されるサンプルクエリです:

SELECT ID, Name, Location.ToString() as Location FROM MyTable 

はここで持ったエンティティをクエリの例ですよく知られているテキストまたは「地理」オブジェクトの文字列表現が含まれている「場所」フィールド:

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つの追加の事は、あなたがするので、ストアドプロシージャ内の任意の空間ベースのクエリを実行する必要がありますですテーブルのすべてのデータを.NETを使用して、LINQを使用して独自の空間クエリを実行します。

これはネイティブにSQL空間型をサポートするものではありませんが、Entity FrameworkとSQL Spatialを同時に使用することができます。

+0

優秀、ありがとう、クリス。私はこれを見てみましょう! –

+0

これは私がL2Sを使って演奏/演奏してきたことです。 –

+0

ありがとうありがとうございます:) –

1

また、手書きのテーブルと列でLinq-to-SQLを実行し、SQL空間タイプを直接取得することもできます。私は

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; 
} 
関連する問題