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

时间:2015-01-28 12:23:52

标签: c# sql-server linq linq-to-entities spatial

来自System.Data.Entity.SqlServer.SqlSpatialFunctions班级定义:

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

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

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

我试图让所有多边形都具有某些特定点(它还具有延迟加载属性Address,它具有名为Location的DbGeography类型属性)。

我可以这样做:

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

工作正常。

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

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

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

此功能只能从LINQ到实体调用。

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

1 个答案:

答案 0 :(得分:0)

我唯一能够想出一个严重的黑客攻击。它有效,但我没有声称优雅。

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

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应用程序使用。