Linb에서 SQL 까지까지 처리 할 수있는 varbinary (max)로 열을 캐스팅합니다. 모든 쿼리에서이 작업을 피하는 한 가지 방법은 CAST(GeographyColumn AS varbinary(max))
으로 정의 된 계산 열을 추가하는 것입니다.
데이터를 가져 오면 MemoryStream
및 IBinarySerialize
을 사용하여 실제 유틸리티 메소드를 작성하여 Microsoft.SqlServer.Types.SqlGeography
클래스로 변환 할 수 있습니다. Read
/Write
방법.
지리, 지오 메트 리, hierarchyid 및 모든 사용자 지정 유형을 포함하여 CLR 유형을 사용하여 작업해야하는 경우 이것이 유일한 해결책입니다. Linq는이 중 하나를 "기본적으로"지원하지 않습니다. 보일러 플레이트 코드를 작성하는 것은 약간의 어려움이 있지만 몇 가지 확장 방법을 사용하면 더 쉽게 만들 수 있습니다.
이렇게하면 열에 대해 쿼리 할 수 없습니다. 그러나, 당신은 Linq Dynamic Query Library을 사용하여 내가 거기에서 중도라고 부르는 것을 얻을 수 있습니다. Intellisense 또는 다른 Linq 제품은 없지만 모든 쿼리를 수작업으로 작성하는 것보다 여전히 구성 가능하며 따라서 더 강력합니다. 강력한 형식의 결과를 얻을 수 있습니다.
업데이트 : 약간 더 깨끗한 해결책을 찾았습니다 here. 이 방법으로 디자이너를 사용할 수 있습니다. 부분 클래스에 SqlGeography
래퍼 속성을 추가하고 SqlBytes
클래스와 함께 STGeomFromWKB
메서드를 사용하면됩니다. 하지만 여전히 인라인 쿼리 기능을 제공하지는 않습니다.
하지만 공간 쿼리를 실행할 때 도움이되지는 않습니까? 내 말은, 만약 내가 원한다면 여전히 내 자신의 쿼리를 만들어야 만 할 것이다. SELECT X WHERE Y.STIntersects (X)' –
네, 불행히도, Linq를 감추는 더 좋은 방법이 있었다고하더라도 SQL에서 CLR 유형을 열로 받아들이는 경우에도 메소드를 SQL 함수 호출로 맵핑하는 방법을 알지 못합니다. 가장 좋은 방법은 SQL Server 자체에서 SP 또는 UDF로 이러한 쿼리를 작성하는 것입니다.하지만 응용 프로그램에서 반드시 SQL을 작성해야한다면 Linq 동적 쿼리 라이브러리를 사용하여 원하는 것을 얻을 수 있습니다. – Aaronaught
DynamicQuery에 익숙하지 않은 경우를 대비하여 링크로 답변을 업데이트했습니다. – Aaronaught