代码之家  ›  专栏  ›  技术社区  ›  Dominik

EF5几何相交查询不返回任何结果

  •  0
  • Dominik  · 技术社区  · 11 年前

    我有一个SQL Server 2008 R2表,该表具有 geometry (非地理)列,以及其他一些“标准”列。我目前在表中有一行要测试,该记录中的几何体列有一个具有以下边界的多边形,当我插入多边形时,SRID为0(零):

    POLYGON ((380 220, 380 575, 585 575, 380 575, 380 220))
    

    现在我想使用EF5检查一个点是否在那个多边形中。首先我创建了一个点:

    DbGeometry testPoint = DbGeometry.PointFromText("POINT(400 240)", 0);
    
    List<LocationArea> tResults = (from s in db.LocationAreas
           where testPoint .Intersects(SqlSpatialFunctions.MakeValid(s.AreaBounds))
           select s).ToList();
    

    我得到的第一个错误,在添加 SqlSpatialFunctions.MakeValid 方法是 s.AreaBounds 结果不是“有效的”,而代码中创建的点是。在这个出色的帖子的帮助下修复了这个问题-> query-dbgeometry-for-specific-latlng-value

    现在,我可能会疯掉(我已经看了这段代码一段时间了),但我总是会返回一个空列表(计数=0),我相信点在多边形边界内。

    所以,任何建议都会受到赞赏,就像我说的那样,可能只是我:-)

    多米尼克

    1 回复  |  直到 8 年前
        1
  •  0
  •   Dominik    11 年前

    在尝试了很多不同的方法以获得我想要的结果后,下面的代码终于可以工作了,而且每次都可以工作,到目前为止,我已经尝试过的每一个多边形/点场景。

    我不知道为什么需要这样做,但我当然希望这能在将来将几何SQL列与实体框架一起使用时对其他人有所帮助:

    DbGeometry testPoint = DbGeometry.PointFromText("POINT(400 240)", 0);
    
    List<LocationArea> tResults = (from s in db.LocationAreas
       where testPoint .Intersects(SqlSpatialFunctions.MakeValid(s.AreaBounds).Envelope)
       select s).ToList();
    

    我在经过一些深入调试并真正查看了通过Linq查询返回的DBGeometry字段后发现了这一点。我发现s.AreaBounds字段返回了 字符串(…) 值,而不是最初保存在数据库中的值 多边形(…) 价值进一步查看返回的对象财产,我发现 信封 得到了我想要的。