Lanza la columna a varbinary (max), que Linq a SQL puede manejar. Una forma de evitar hacer esto en cada consulta es simplemente agregar una columna calculada como CAST(GeographyColumn AS varbinary(max))
.
Una vez que tenga los datos byte[]
, se puede escribir un método de utilidad corta para convertirlo en la clase real Microsoft.SqlServer.Types.SqlGeography
utilizando un MemoryStream
y la IBinarySerialize
. Read
/Write
métodos.
Hasta donde yo sé, esta es la única solución de trabajo si necesita trabajar con cualquier tipo de CLR, incluyendo geografía, geometría, hierarchyid y cualquier tipo personalizado - Linq no admite "de forma nativa" ninguno de ellos. Es un poco doloroso escribir todo el código repetitivo, pero puede hacerlo más fácil con algunos métodos de extensión.
No podrá realizar consultas en la columna de esta manera; sin embargo, puede obtener lo que llamaría a la mitad utilizando el Linq Dynamic Query Library. No tendrá intellisense ni algunos de los otros artilugios de Linq, pero sigue siendo composable y, por lo tanto, mejor que la elaboración manual de cada consulta, y puede obtener resultados de tipo sólido.
Actualización: Encontré una solución ligeramente más limpia here. Puede usar el diseñador de esta manera; sólo tiene que añadir la propiedad SqlGeography
envoltorio a una clase parcial y utilizar el método STGeomFromWKB
con la clase SqlBytes
. Sin embargo, eso todavía no le dará capacidades de consulta en línea.
Ok, pero eso no va a hacer nada para ayudarme a ejecutar consultas espaciales ¿verdad? Quiero decir, aún tendría que crear mis propias consultas si quisiera hacer los gustos de 'SELECT X WHERE Y.STIntersects (X)' –
Sí, lo hará, desafortunadamente, incluso si hubiese una mejor manera de convencer a Linq para que SQL acepte el tipo CLR como una columna, aún no sabría cómo asignar sus métodos a las llamadas a función SQL. Su mejor opción es escribir estas consultas como SP o UDF en SQL Server, pero si debe escribir su SQL en la aplicación, entonces puede obtener lo que desea utilizando la Biblioteca de consultas dinámicas de Linq. – Aaronaught
Actualicé la respuesta con un enlace en caso de que no esté familiarizado con DynamicQuery. – Aaronaught