也许我错过了一些东西。我有一个“Geography”数据类型的sql服务器列。sql地理到dbgeography?
我想在我的C#代码中使用DbGeography类型。任何方式来从sql的地理转换或转换为dbgeography?
也许我错过了一些东西。我有一个“Geography”数据类型的sql服务器列。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,提供的解决方案似乎可以。 早期版本可以,但是使用EF6,我们不应该引用这个程序集。 它使EF litle变得疯狂。
你能更具体吗?究竟发生了什么以及什么是正确的解决方案? – grahamesd 2014-06-13 21:29:17
对于其他读者来说,我仍然使用我提供的带有零**问题的EF6解决方案。 – 2014-06-14 19:32:24
当性能是任何意义,众所周知的二进制应该用来代替知名文本:
var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value);
有使用过载一个SRID,如果这很重要的话。在我与1000个相当复杂的多边形简单的测试,基于二进制的方法比快4倍的基于文本的一个:
* 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 2015-03-22 23:01:24
对于反向操作:'SqlGeography.STGeomFromWKB(new SqlBytes(value.AsBinary()),value.CoordinateSystemId)' – 2015-03-23 09:22:19
,我发现这是一个有效的解决方案:
int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326;
SqlGeography g = SqlGeography.Point(lat, lon, coordSys);
return DbSpatialServices.Default.GeographyFromProviderValue(g);
没有序列化/转换为可以杀死性能的字符串(WKT)或二进制(WKB)。
这是为我工作的EF 6.1.3,SqlServer的2016 SP1和Microsoft.SqlServer.Types.14.0.314.76
我会补充说,如果你使用的SqlGeography大于v10(SQL 2008),那么这个方法会抛出一个错误,这意味着如果你需要SQL 2012及以上版本的任何功能,那么你就搞砸了。虽然性能不错。 – 2017-04-09 06:39:40
我会假设没有反向方法吗? – 2017-04-09 06:44:56
应该有一个相反的方法。目前无法分辨。 – 2017-04-10 17:05:47
基于对ILSpy我EntityFramework.SqlServer.dll的阅读,相信最快的方法从SqlGeography转换到DbGeography是:
var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo);
此方法的优点是不需要进行二进制转换和解析。它只是使用SqlGeography作为内部提供者值返回一个DbGeography。
我实际上在另一个项目,这再次回来了,所以谢谢,正是我在找什么。 – radpin 2013-09-09 20:34:49
我见过这个建议几次,但在.NET中使用时,MakeValid方法在SqlGeography类型上似乎不可用。我错过了什么吗? – joelmdev 2013-10-11 13:10:56
@ jm2如果你已经引用了Microsoft.SqlServer.Types,它应该对你有用。 – 2013-10-11 16:21:46