2013-02-27 6 views
16

Vielleicht vermisse ich etwas. Ich habe eine SQL-Server-Spalte des "Geographie" -Datentyps.sql geographie zu dbgeography?

Ich möchte den DbGeography-Typ in meinem C# -Code verwenden. Gibt es eine Möglichkeit, die geographische Lage von sql in dbgeography umzuwandeln?

Antwort

24

Sorry für die späte Antwort - aber sah dies während der Suche nach etwas anderem.

einfach wie folgt vor:

SqlGeography theGeography; 
int srid = 4326; // or alternative 

DbGeography newGeography = DbGeography.FromText(theGeography.ToString(), srid); 

es rückgängig zu machen:

DbGeography theGeography; 
SqlGeography newGeography = SqlGeography.Parse(theGeography.AsText()).MakeValid(); 

Hoffnung, das hilft!

+0

Ich bin eigentlich auf einem anderen Projekt, wo das wieder zurück kam, also danke, genau das, was ich suchte. – radpin

+0

Ich habe dies einige Male empfohlen, aber die MakeValid-Methode scheint nicht zur Verfügung stehen auf SqlGeography Typ, wenn in .NET verwendet. Fehle ich etwas? – joelmdev

+0

@ jm2 Wenn Sie auf Microsoft.SqlServer.Types verwiesen haben, sollte es für Sie verfügbar sein. –

1

Die angegebene Lösung scheint in Ordnung zu sein, wenn Sie EF6 nicht ausführen. Mit frühen Versionen ist es in Ordnung, aber mit EF6, sollten wir nicht auf diese Baugruppe verweisen. Es macht EF leicht verrückt.

+0

Konnten Sie spezifischer sein? Was genau passiert und was ist die richtige Lösung? – grahamesd

+1

Für jeden, der dies liest, verwende ich immer noch meine bereitgestellte Lösung mit EF6 mit ** Null ** Problemen. –

1

Sie müssen wie oben erwähnt eine Referenz zu den Baugruppen hinzufügen. Der folgende Beitrag, den Sie können link helfen, link2

8

Wenn die Leistung ist von Bedeutung, die bekannte binäre anstelle des bekannten Text verwendet werden soll:

var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value); 

Es ist eine Überlastung mit eine SRID, wenn das wichtig ist. In meinem einfachen Test mit 1000 einigermaßen komplizierten Polygone des binäre basierten Ansatz ist 4-mal schneller als die textbasierte:

* 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 
+0

Schreckliches Update, großartige Möglichkeit, die Leistung zu verbessern. – radpin

+1

Für die umgekehrte Operation: 'SqlGeography.STGeomFromWKB (neue SqlBytes (value.AsBinary()), value.CoordinateSystemId)' –

0

Ich finde diese als Arbeitslösung:

int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326; 
SqlGeography g = SqlGeography.Point(lat, lon, coordSys); 
return DbSpatialServices.Default.GeographyFromProviderValue(g); 

Nr Serialisierung/Konvertierung in Zeichenfolge (WKT) oder Binär (WKB), die Leistung zu töten.

Es ist für mich auf EF Arbeits 6.1.3, SqlServer 2016 SP1 und Microsoft.SqlServer.Types.14.0.314.76

+0

Ich werde hinzufügen, dass wenn Sie SqlGeography größer als v10 (SQL 2008) verwenden, wird diese Methode ausgelöst ein Fehler, das heißt, wenn Sie eine der Funktionen von SQL 2012 und höher benötigen, sind Sie geschraubt. Leistung ist aber gut. –

+0

Ich gehe davon aus, dass es auch keine umgekehrte Methode gibt? –

+0

Es sollte eine umgekehrte Methode geben. Ich kann es jetzt nicht sagen. –

1

Basierend auf meiner Lektüre von EntityFramework.SqlServer.dll in ILSpy, glaube ich, den schnellsten Weg konvertieren von SqlGeography zu DbGeography ist:

var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo); 

Diese Methode hat den Vorteil, dass keine Binärkonversion und Parsing erforderlich ist. Es gibt einfach eine DbGeography mit der SqlGeography als internen Anbieterwert zurück.

Verwandte Themen