EF5几何相交查询不返回任何内容

时间:2013-09-30 05:52:40

标签: c# .net sql-server-2008-r2 entity-framework-5

我有一个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结果不是“有效”,而代码中创建的点是。修复了这个优秀帖子的帮助 - &gt; query-dbgeometry-for-specific-latlng-value

现在,我可能会疯狂(我一直在看这段代码),但是我总是得到一个返回的空列表(count = 0),我相信这个点在多边形范围内。 / p>

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

多米尼克

1 个答案:

答案 0 :(得分:0)

在尝试了许多不同的东西以获得我想要的结果之后,现在下面的代码终于可以工作了,并且每次都有效,我到目前为止已经抛出了每个多边形/点场景。

为什么这是必需的我不知道,但我当然希望将来在使用带有Entity Framework的几何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字段返回了一个 LINESTRING(...)值而不是最初保存在数据库中的值,这是一个 POLYGON(...)值。进一步查看返回的对象属性,我发现 .Envelope 有我想要的。