来自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 在这个阶段。
答案 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应用程序使用。