有没有办法在没有 Linq to Entities 的情况下使用 SqlSpatialFunctions?

Posted

技术标签:

【中文标题】有没有办法在没有 Linq to Entities 的情况下使用 SqlSpatialFunctions?【英文标题】:Is there a way to use SqlSpatialFunctions without Linq to Entities? 【发布时间】:2015-01-28 12:23:51 【问题描述】:

来自System.Data.Entity.SqlServer.SqlSpatialFunctions类定义:

包含将 Linq 中的 SqlServer 方法公开给实体的函数存根。

我知道特别提到了 Linq to Entities,但是我想知道是否可以在我的后端代码中复制某些功能。

我有一个帐户模型,带有延迟加载的多边形集合。每个多边形都包含一个名为 Location 的 DbGeography 类型属性。

我正在尝试获取与某个点相交的所有多边形(它还具有延迟加载的属性地址,它具有称为位置的 DbGeography 类型属性)。

我可以这样做:

var matchedPolygons =
    account.Polygons.Where(
       x =>
          point.Address.Location.Intersects(x.Polygon.Location)).ToList();

效果很好。

为了尝试提高性能,我认为稍微减少 Polygon 数据是个好主意。

var matchedPolygons =
    account.Polygons.Where(
       x =>
          point.Address.Location.Intersects(SqlSpatialFunctions.Reduce(x.Polygon.Location, 100))).ToList();

然而,这会引发以下 System.NotSupportedException 异常:

此函数只能从 LINQ to Entities 调用。

我知道我可以使用上面的 Reduce 方法直接从我的存储库层检索多边形,但由于我使用延迟加载并且已经有 Polygons 集合可供我使用,我认为可能有一种使用方法 SqlSpatialFunctions 在这个阶段。

【问题讨论】:

【参考方案1】:

我唯一能想出一个粗略的破解方法。它有效,但我不主张优雅。

折腾这些包括(也做参考):

using System.Data.Entity.Spatial;
using System.Data.SqlTypes;

将 DbGeography 转换为 SqlGeography:

    Microsoft.SqlServer.Types.SqlGeography sqlGeography = Microsoft.SqlServer.Types.SqlGeography.STGeomFromWKB(new SqlBytes(geog.AsBinary()), mydbgeog.CoordinateSystemId);

如果你把它保留为 SqlGeography 可能没关系,但如果不将它转换回来。

sqlGeography = sqlGeography.Reduce(50);

mydbgeog = DbGeography.FromBinary(sqlGeography.STAsBinary().Value);

It's the fastest way I know of to toss back and forth between DbGeography and SqlGeography。同样,它很粗糙,需要额外的库,但老实说,SqlGeography 中有很多东西对于大型 GIS 应用程序可能需要。

【讨论】:

以上是关于有没有办法在没有 Linq to Entities 的情况下使用 SqlSpatialFunctions?的主要内容,如果未能解决你的问题,请参考以下文章

在 LINQ to Entities 中批量删除

如果存在-UPDATE-else-INSERT 与 Linq-to-Entities?

在LINQ to Entities查询中调用自定义标量数据库函数?

在 LINQ to Entities 中正确比较没有时间的 DatetimeOffset

VB.Net Linq to Entities Null 比较 - “啥都没有”或“= 啥都没有”?

Linq to Entities Group By 有一些没有元素的组