昨天在項目中,用到 EntityFramework 通過SQL語句查詢。
具體的SQL語句如下:
SELECT t.* FROM ( SELECT c.id AS CommunityId, c.`name` AS CommunityName, ASTEXT(c.spatial_data) AS CommunitySpatialData, s.id AS StreetId, s.`name` AS StreetName, ASTEXT(s.spatial_data) AS StreetSpatialData, MBRContains (s.spatial_data ,ST_GeometryFromText('Point(@Longitude @Latitude)')) AS streetIn, MBRContains (c.spatial_data ,ST_GeometryFromText('Point(@Longitude @Latitude)')) AS communityIn FROM community c LEFT JOIN street s ON c.street_id = s.id ) AS t WHERE t.streetIn = 1 AND t.communityIn = 1;
應該說這樣沒有問題的,但是查詢一直報錯:“Invalid GIS data provided to function st_geometryfromtext.”
換了多種傳參方式,但是都還有問題。
經過各種調試、修改參數,大致可以確定是:兩個參數是連續的,中間有空格,但是在參數替換后空格替換沒了,導致數據格式出錯。
再次調整下傳的參數就可以,修改后SQL語句:
SELECT t.* FROM ( SELECT c.id AS CommunityId, c.`name` AS CommunityName, ASTEXT(c.spatial_data) AS CommunitySpatialData, s.id AS StreetId, s.`name` AS StreetName, ASTEXT(s.spatial_data) AS StreetSpatialData, MBRContains (s.spatial_data ,ST_GeometryFromText(@point)) AS streetIn, MBRContains (c.spatial_data ,ST_GeometryFromText(@point)) AS communityIn FROM community c LEFT JOIN street s ON c.street_id = s.id ) AS t WHERE t.streetIn = 1 AND t.communityIn = 1;
對應的 point 是:
string point = "Point(" + Longitude + " " + Latitude + ")";
雖然知道了問題,也解決了,但是沒有徹底解決這個問題。
有知道的可以告知下。
注意:
1、對於面數據:最后一個點應該是第一個點,這樣在入庫的時候才正確,否則報錯“Invalid GIS data provided to function st_geometryfromtext.”