C# 有没有一种方法可以在不使用Linq的情况下使用SqlSpatialFunction来创建实体?

C# 有没有一种方法可以在不使用Linq的情况下使用SqlSpatialFunction来创建实体?,c#,sql-server,linq,linq-to-entities,spatial,C#,Sql Server,Linq,Linq To Entities,Spatial,从System.Data.Entity.SqlServer.SqlSpatialFunctions类定义: 包含将Linq中的SqlServer方法公开给实体的函数存根 我知道LINQtoEntities是专门提到的,但是我想知道是否可以在我的后端代码中复制一些功能 我有一个帐户模型,包含延迟加载的多边形集合。每个多边形都包含一个名为Location的DbGeography类型属性 我试图获取所有对某个点感兴趣的多边形(该点还具有延迟加载的属性地址,该属性具有名为Location的DbGeogr

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

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

我知道LINQtoEntities是专门提到的,但是我想知道是否可以在我的后端代码中复制一些功能

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

我试图获取所有对某个点感兴趣的多边形(该点还具有延迟加载的属性地址,该属性具有名为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方法直接从我的存储库层检索多边形,但是由于我使用的是延迟加载,并且已经有了多边形集合,所以我认为在这个阶段可能会有一种使用SQLSpatialFunction的方法。

这是我唯一能够想出的一个大难题。它很管用,但我不主张优雅

包括以下内容(同时提供参考):

将DbGeography转换为SqlGeography:

    Microsoft.SqlServer.Types.SqlGeography sqlGeography = Microsoft.SqlServer.Types.SqlGeography.STGeomFromWKB(new SqlBytes(geog.AsBinary()), mydbgeog.CoordinateSystemId);
如果您将其保留为SqlGeography,可能还可以,但如果不将其转换回SqlGeography,则可以

sqlGeography = sqlGeography.Reduce(50);

mydbgeog = DbGeography.FromBinary(sqlGeography.STAsBinary().Value);
。同样,这很糟糕,需要一个额外的库,但老实说,SqlGeography中有很多东西对于一个大型GIS应用程序可能需要

sqlGeography = sqlGeography.Reduce(50);

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