Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 林氏;不支持的数据类型(地理位置)_Linq To Sql_Geography_Spatial Query - Fatal编程技术网

Linq to sql 林氏;不支持的数据类型(地理位置)

Linq to sql 林氏;不支持的数据类型(地理位置),linq-to-sql,geography,spatial-query,Linq To Sql,Geography,Spatial Query,因此,Linq不支持Geography数据类型,这在可爱的“将表拖到Linq设计图面”developerNT模型中是一个主要问题 是否有任何方法可以扩展Linq以处理地理数据类型? 或者,无论何时需要使用地理列,我都需要构建一个全新的数据层和一组查询 我已经在这个问题上纠缠了几天,无法确定这是否可行。您必须自己手动将其映射/解析为自己的POCO类型。将该列强制转换为varbinary(max),这是Linq to SQL可以处理的。避免在每个查询中执行此操作的一种方法是只添加一个定义为CAST的

因此,Linq不支持
Geography
数据类型,这在可爱的“将表拖到Linq设计图面”developerNT模型中是一个主要问题

是否有任何方法可以扩展Linq以处理地理数据类型? 或者,无论何时需要使用地理列,我都需要构建一个全新的数据层和一组查询


我已经在这个问题上纠缠了几天,无法确定这是否可行。

您必须自己手动将其映射/解析为自己的POCO类型。

将该列强制转换为varbinary(max),这是Linq to SQL可以处理的。避免在每个查询中执行此操作的一种方法是只添加一个定义为
CAST的计算列(GeographyColumn为varbinary(max))

拥有
byte[]
数据后,可以编写一个简短的实用程序方法,使用
MemoryStream
IBinarySerialize
读取
/
写入
方法将其转换为实际的
Microsoft.SqlServer.Types.SqlGeography

据我所知,如果您需要使用任何CLR类型,包括地理、几何、hierarchyid和任何自定义类型,这是唯一可行的解决方案—Linq“本机”不支持任何这些类型。编写所有的样板代码有点麻烦,但是您可以使用一些扩展方法使其更容易

您将无法通过这种方式查询该列;但是,你可以在中途使用。您将没有intellisense或其他一些Linq产品,但它仍然是可组合的,因此比手工制作每个查询要好,并且您可以得到强类型的结果


更新:我找到了一个稍微干净一点的解决方案。您可以这样使用设计器;只需将
SqlGeography
wrapper属性添加到分部类中,并将
STGeomFromWKB
方法与
SqlBytes
类一起使用。不过,这仍然不能为您提供内联查询功能。

好的,但这无助于我运行空间查询,不是吗?我的意思是,如果我想做
SELECT X WHERE Y.STIntersects(X)
是的,不幸的是,你会的——即使有更好的方法诱使Linq to SQL接受CLR类型作为列,它仍然不知道如何将其方法映射到SQL函数调用中。您最好将这些查询作为SP或UDF写入SQL Server本身,但如果您确实必须在应用程序中写入SQL,那么您可能可以使用Linq动态查询库获取所需内容。我使用链接更新了回复,以防您不熟悉DynamicQuery。