2009-12-12 9 views
5

Por lo tanto, Linq no admite el tipo de datos Geography, que arroja una gran llave en las obras en el adorable modelo de desarrollo 'superficie de diseño Linq'.Tipos de datos no admitidos (Geografía)

¿Hay alguna manera de que pueda extender Linq para que funcione con el tipo de datos Geography? ¿O tendré que crear una nueva capa de datos y un conjunto de consultas para cada vez que necesite usar columnas de Geografía?

Me he quedado atrapado en esto por unos días y no puedo resolver si es posible.

Respuesta

1

Looks like tendrá que manualmente asignar/analizar usted mismo a su propio tipo de POCO.

3

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.

+0

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)' –

+0

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

+0

Actualicé la respuesta con un enlace en caso de que no esté familiarizado con DynamicQuery. – Aaronaught

Cuestiones relacionadas