多分私は何かを欠いている。私は "地理"のデータ型のSQL Serverの列を持っています。SQLジオグラフィーからdbgeographyへ?
私はC#コードでDbGeographyタイプを使いたいと思います。キャストするかSQLの地理学からdbgeographyに変換する方法はありますか?
多分私は何かを欠いている。私は "地理"のデータ型のSQL Serverの列を持っています。SQLジオグラフィーからdbgeographyへ?
私はC#コードでDbGeographyタイプを使いたいと思います。キャストするかSQLの地理学からdbgeographyに変換する方法はありますか?
ご返信が遅いのは残念ですが、何か他のものを探している間にこれを見ました。
は、単純に次のようにします。
SqlGeography theGeography;
int srid = 4326; // or alternative
DbGeography newGeography = DbGeography.FromText(theGeography.ToString(), srid);
それを逆にする:
DbGeography theGeography;
SqlGeography newGeography = SqlGeography.Parse(theGeography.AsText()).MakeValid();
役に立てば幸い!
EF6を実行していない場合、提供されている解決策は問題ありません。 初期のバージョンではokですが、EF6では、このアセンブリへの参照を作成するべきではありません。 EF litleが狂ってしまいます。
もっと具体的になりますか?正確に何が起こり、正しい解決策は何ですか? – grahamesd
これを読んでいる誰かのために、私はまだ私の提供したソリューションをEF6で**ゼロ**の問題で使用しています。 –
パフォーマンスがどの重要である、よく知られたバイナリではなく、よく知られたテキストを使用する必要があります。
var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value);
過負荷が使用してありますそれが重要な場合はSRID。千の合理的に複雑なポリゴンとの私の簡単なテストでは、バイナリベースのアプローチは、より4倍高速であるテキストベースの1:
int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326;
SqlGeography g = SqlGeography.Point(lat, lon, coordSys);
return DbSpatialServices.Default.GeographyFromProviderValue(g);
ませんシリアライズ:
* Binary-based conversion
Run 1: 1948
Run 2: 1944
Run 3: 1959
Run 4: 1979
Run 5: 1988
Average: 1963.6
* Text-based conversion
Run 1: 8527
Run 2: 8553
Run 3: 8596
Run 4: 8535
Run 5: 8496
Average: 8541.4
素晴らしいアップデート、パフォーマンスを向上させる素晴らしい方法。 – radpin
逆の操作の場合: 'SqlGeography.STGeomFromWKB(new SqlBytes(value.AsBinary())、value.CoordinateSystemId)' –
は、私は実用的なソリューションとして、これを見つけました/パフォーマンスを低下させる文字列(WKT)またはバイナリ(WKB)に変換します。
それはILSpyでEntityFramework.SqlServer.dllの私の読書に基づいてEF 6.1.3、のSQLServer 2016 SP1およびMicrosoft.SqlServer.Types.14.0.314.76
v10より大きいSqlGeographyを使用している場合(SQL 2008)、このメソッドは、エラー、つまり、SQL 2012以降の機能のいずれかが必要な場合は、あなたは嫌です。パフォーマンスは良いですが。 –
逆の方法もないと思いますか? –
逆の方法があります。今話せません。 –
に私のために働いている、私は最も簡単な方法を信じてSqlGeographyからDbGeographyに変換する:
var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo);
この方法には、バイナリ変換と解析が必要ないという利点があります。内部プロバイダの値としてSqlGeographyを使用してDbGeographyを返します。
私は実際にこれがもう一度バックアップされた別のプロジェクトに参加しています。ありがとう、ちょうど私が探していたものです。 – radpin
これは何度か推奨されていますが、MakeValidメソッドは.NETで使用するときはSqlGeographyタイプでは使用できないようです。何か不足していますか? – joelmdev
@ jm2 Microsoft.SqlServer.Typesを参照していれば、それを利用できるはずです。 –