【问题标题】:Linq & unsupported data types (Geography)Linq 和不支持的数据类型(地理)
【发布时间】:2010-12-25 22:19:11
【问题描述】:

因此,Linq 不支持 Geography 数据类型,这在可爱的“将表格拖到 Linq 设计表面”开发模型中的工作中产生了重大影响。

有什么方法可以扩展 Linq 以使用 Geography 数据类型? 或者我是否需要构建一个全新的数据层和一组查询,以便在我需要使用地理列时使用?

我已经被困在这个问题上几天了,如果可能的话,我无法解决。

【问题讨论】:

    标签: linq-to-sql geography spatial-query


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      获得byte[] 数据后,您可以编写一个简短的实用方法,使用MemoryStreamIBinarySerialize.Read/Write 方法将其转换为实际的Microsoft.SqlServer.Types.SqlGeography 类。

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

      您将无法通过这种方式查询该列;但是,您可以使用Linq Dynamic Query Library 获得我在中途所说的内容。您不会有智能感知或其他一些 Linq 好东西,但它仍然是可组合的,因此比手工制作每个查询要好,而且您可以获得强类型的结果。

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

      【讨论】:

      • 好的,但这对帮助我运行空间查询没有任何帮助,对吧?我的意思是,如果我想做SELECT X WHERE Y.STIntersects(X) 之类的事情,我仍然需要创建自己的查询
      • 是的,不幸的是,你会的——即使有更好的方法来诱使 Linq to SQL 接受 CLR 类型作为列,它仍然不知道如何将其方法映射到 SQL 函数来电。最好的办法是在 SQL Server 本身中将这些查询编写为 SP 或 UDF,但如果您绝对必须在应用程序中编写 SQL,那么您可以使用 Linq 动态查询库获得您想要的。
      • 我用链接更新了回复,以防您不熟悉 DynamicQuery。
      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2017-12-06
      相关资源
      最近更新 更多