Может, я что-то упустил. У меня есть столбец sql-сервера типа данных "География".
Я хочу использовать тип DbGeography в моем коде С#. Любой способ сделать или преобразовать из sql географии в dbgeography?
Может, я что-то упустил. У меня есть столбец sql-сервера типа данных "География".
Я хочу использовать тип 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();
Надеюсь, что это поможет!
Когда производительность играет важную роль, вместо известного текста следует использовать хорошо известный двоичный код:
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
Вы должны добавить ссылку на сборки, как указано выше. Следующая публикация может помочь вам , link2
Основываясь на моем чтении EntityFramework.SqlServer.dll в ILSpy, я считаю, что самый быстрый способ конвертировать из SqlGeography в DbGeography:
var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo);
Этот метод имеет то преимущество, что не требуется двоичное преобразование и разбор. Он просто возвращает DbGeography, используя SqlGeography в качестве внутреннего значения поставщика.
Предоставленное решение выглядит нормально, если вы не используете EF6. С ранними версиями в порядке, но с EF6 мы не должны ссылаться на эту сборку. Это превращает EF в сумасшедший.
Я нашел это в качестве рабочего решения:
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