因此,Linq 不支持Geography
数据类型,这在可爱的“将表格拖到 Linq 设计表面”开发模型中的工作中抛出了一个主要扳手。
有什么方法可以扩展 Linq 以使用 Geography 数据类型?或者我是否需要在需要使用地理列时构建一个全新的数据层和一组查询?
我已经坚持了几天,如果可能的话,我无法解决。
因此,Linq 不支持Geography
数据类型,这在可爱的“将表格拖到 Linq 设计表面”开发模型中的工作中抛出了一个主要扳手。
有什么方法可以扩展 Linq 以使用 Geography 数据类型?或者我是否需要在需要使用地理列时构建一个全新的数据层和一组查询?
我已经坚持了几天,如果可能的话,我无法解决。
将列转换为 varbinary(max),Linq to SQL可以处理。避免在每个查询中执行此操作的一种方法是添加一个定义为的计算列CAST(GeographyColumn AS varbinary(max))
。
获得byte[]
数据后,您可以编写一个简短的实用程序方法,Microsoft.SqlServer.Types.SqlGeography
使用 aMemoryStream
和IBinarySerialize
. Read
/Write
方法。
据我所知,如果您需要使用任何 CLR 类型(包括地理、几何、hierarchyid 和任何自定义类型),这是唯一可行的解决方案——Linq 并不“本机”支持其中任何一个。编写所有样板代码有点痛苦,但您可以使用一些扩展方法使其变得更容易。
您将无法以这种方式查询该列;但是,您可以使用Linq Dynamic Query Library中途获得我所说的内容。您不会拥有智能感知或其他一些 Linq 好东西,但它仍然是可组合的,因此比手工制作每个查询要好,并且您可以获得强类型的结果。
更新:我在这里找到了一个稍微干净的解决方案。您可以这样使用设计器;只需将SqlGeography
包装器属性添加到部分类并将该STGeomFromWKB
方法与SqlBytes
该类一起使用。不过,这仍然不会为您提供内联查询功能。
看起来您必须自己手动将其映射/解析为您自己的 POCO 类型。