2015-01-28 4 views
4

부터 System.Data.Entity.SqlServer.SqlSpatialFunctions 클래스 정의 :Linq를 사용하지 않고 SqlSpatialFunctions를 사용하는 방법이 있습니까?

Linq의 SqlServer 메서드를 엔터티에 표시하는 함수 스텁이 들어 있습니다.

Linq가 Entities에 구체적으로 언급 된 것을 알고 있지만 일부 기능을 백 엔드 코드에 복제 할 수 있는지 궁금합니다.

계정 모델이 있습니다. 게으른로드 된 다각형 컬렉션이 있습니다. 각 다각형에는 위치라는 DbGeography 유형 속성이 있습니다.

특정 점 (또한 위치라고 불리는 DbGeography 유형 속성이있는 지연로드 속성 주소가 있음)과 상호 작용하는 모든 다각형을 얻으려고합니다.

나는 이런 식으로 작업을 수행 할 수 있습니다 잘 작동

var matchedPolygons = 
    account.Polygons.Where(
     x => 
      point.Address.Location.Intersects(x.Polygon.Location)).ToList(); 

합니다.

성능 향상을 위해 폴리곤 데이터를 약간 줄이는 것이 좋습니다.

이 기능은 엔티티에 LINQ에서 호출 할 수 있습니다 :

var matchedPolygons = 
    account.Polygons.Where(
     x => 
      point.Address.Location.Intersects(SqlSpatialFunctions.Reduce(x.Polygon.Location, 100))).ToList(); 

이 그러나 다음 System.NotSupportedException 예외가 발생합니다.

은 내가이 (가) 위의 방법을 절감하여 내 저장소 계층에서 직접 다각형을 검색 할 수 있습니다 알고 있지만, 내가 게으른 로딩을 사용하고 있기 때문에 이미 나에게 가능한 다각형의 컬렉션이, 내가 사용하는 방법이 될 줄 알았는데 이 단계에서 SqlSpatialFunctions.

답변

0

나는 총 해킹을 생각해 낼 수 있었던 유일한 방법입니다. 그것은 효과가 있지만 우아함에 대해서는 아무런 주장도하지 않습니다. SqlGeography에 DbGeography 변환

using System.Data.Entity.Spatial; 
using System.Data.SqlTypes; 

: 다음에

토스합니다 (물론 참고 문헌을) 포함

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 응용 프로그램에 필요한 많은 것들이 필요할 것입니다.

관련 문제