2012-12-18 5 views
1

geom 데이터 형식에서 sqlite intersect 쿼리를 수행하기 위해 Entity Framework를 사용할 수 있습니까?C# Entity Framework sqlite (spatialite) 공간 날짜

내가 내 SQLite 데이터베이스에서 비 공간 데이터를 조회 할 EF를 사용하여 성공을 거두었습니다

string query = @"SELECT * FROM Spatial_Table WHERE intersects(Geom, GeomFromText('LINESTRING (-69.929201602936 23.577301964831, -20.358889102936 37.730080532218, 4.6020483970643 55.586555530742)', 4326)) = 1" 

('libspatialite-4.dll'를로드 한 후) 아래 SQLiteConnection 성공을 있었다.

이 유형의 쿼리가 가능합니까? dll을로드 할 수 있습니까?

고마워요.

답변

4

내가 알고있는 파티에 늦을지라도 (나는 단지 이것을 발견했다.)하지만 받아 들여진 대답은 엄격히 사실이 아니다.

사실은 이것을 지원하기 위해 EF에 기하 및/또는 지리 유형이 없지만 주위를 둘러 볼 수있는 방법이 있습니다. 다음과 같이 데이터베이스 컨텍스트에서 DLL의이 ExecuteSqlCommand를 사용하여 확장을로드 할 수 있습니다

우선 ... :

_ctx.Database.ExecuteSqlCommand(@"SELECT load_extension('libspatialite-4.dll')"); 

을 두 번째로 오히려 텍스트보다 바이너리로 기하학을 반환하는 경우, 당신 DB에서 데이터를 정상으로 가져올 수 있습니다.

byte[] 

데이터 유형. NuGet을 사용하고 ".NET 토폴로지 슈트"(간단히 NTS)를 설치하기 전까지는 약간의 생산성이있는 것처럼 보일 수 있습니다.

NTS에 이러한 바이너리 어레이를 공급할 수 있으며, 귀하의 지오메트리를 나타내는 첫 번째 클래스 .NET 개체. NTS는 Spatialite가 C# 어셈블리에 가지고있는 모든 것을 기본적으로 가지고 있습니다. 실제로 NTS를 사용하면 실제로 spatialite가 필요하지 않습니다. 바이너리 배열을 데이터베이스에 저장하거나 데이터베이스에서 가져와 순전히 자신의 코드에서 조작 할 수 있습니다.

그런 식으로 일하는 것을 잊어 버리는 유일한 방법은 DB에서 지오메트리를 검색하기 위해 SELECT 문과 같은 SQL을 수행하는 것입니다. 당신이 정기적으로 gegraphic 텍스트로 코드에 결과를 반환 할 수 있습니다

두려워하지 말라 그러나 ....이 들어

는 같은

POINT(1 2) 

또는

LINE(1 2,3 4,5 6,7 8) 

모두를 객체 수행해야하는 SQL 쿼리 결과가 Spatialites "AsText"함수를 통해 결과를 전달하여 결과를 생성하는지 확인해야합니다.

그래서 당신의 예를 사용하려면

string query = @"SELECT col1,col2,col3,AsText(GeometryColumn) FROM Spatial_Table WHERE intersects(Geom, GeomFromText('LINESTRING (-69.929201602936 23.577301964831, -20.358889102936 37.730080532218, 4.6020483970643 55.586555530742)', 4326)) = 1" 

같은 생산합니다 어느 : 다음과 같이 일반적인 .NET 객체로 공급할 수

1,2,3,POINT(1 2) 
4,5,6,POINT(3 4) 
1,2,3,POINT(1 2) 
4,5,6,POINT(3 4) 

:

public class myclass 
{ 
    public int col1 { get; set; } 
    public int col2 { get; set; } 
    public int col3 { get; set; } 
    public string GeometryColumn { get; set; } 
} 

및 다시 한번, 당신이 NTS를 사용하면, NTS는 스파에서 전달 된 어떤 것도 그래픽 객체로 변환 할 수 있습니다. 텍스트 문자열에있는 tialite.

My Company는 이러한 기술을 당사의 주력 제품 중 하나에서 매우 안정적으로 사용하며 EF 4.3부터 해왔습니다.

ExecuteSqlCommand는 EF5에 방금 나타 났지만 이전 버전에서 임의의 SQL 문을 실행하는 다른 유사한 방법이 있습니다.

또한 엔티티 테이블에는 SqlQuery라는 새로운 함수가 있습니다.이 함수는 주어진 테이블에서 데이터 판독기 스타일 쿼리를 실행하고 강력하게 형식화 된 모델을 사용하고, 데이터를 되 찾을 수 있습니다.