LINQ2SQL 또는 EF4의 공간 데이터 유형 지원
-
19-09-2019 - |
문제
LINQTOSQL의 VS2010 릴리스 또는 EntityFramework v4가 SQL 2008 공간 데이터 유형에 대한 쿼리를 지원할지 여부를 아는 사람이 있습니까?
다른 팁
Entity Framework / LINQ에서 엔티티에서 작동하는 해결 방법은 다음과 같습니다.
데이터베이스보기를 사용하여 잘 알려진 텍스트 (쿼리에서 "geometry.toString ()"또는 바이너리를 반환 할 수 있습니다. 그런 다음 결과 행이 반환되면 문자열/바이너리를 .net의 sqlgeometry 객체로 변환하십시오.
다음은 지오메트리 유형의 "위치"필드를 잘 알려진 텍스트 문자열로 변환하는 뷰를 작성하는 데 사용되는 샘플 쿼리입니다.
SELECT ID, Name, Location.ToString() as Location FROM MyTable
다음은 "지리"객체의 잘 알려진 텍스트 또는 문자열 표현이 포함 된 "위치"필드가있는 결과 엔티티를 쿼리하는 예입니다.
var e = new MyApp.Data.MyDataEntities(connectionString);
var items = from i in e.MyTables
select i;
foreach (var i in items)
{
// "Location" is the geography field
var l = SqlGeography.Parse(i.Location);
var lat = l.Lat;
var lng = l.Long;
}
한 가지 추가 사항은 LINQ를 사용하여 자신의 공간 쿼리를 수행하기 위해 테이블의 모든 데이터를 .NET으로 가져 오지 않기 때문에 저장 프로 시저 내에서 공간 기반 쿼리를 수행해야한다는 것입니다.
이것은 기본적으로 SQL 공간 유형을 지원하는 것만 큼 우아하지는 않지만 엔티티 프레임 워크와 SQL 공간을 동시에 실행할 수 있습니다.
손으로 쓴 테이블과 열로 Linq-to-SQL을 확실히 수행하고 SQL 공간 유형을 직접 얻을 수 있습니다. 샘플 DB에서 다음을 테스트했습니다 (system.sqlserver.types에 참조 및 '사용'을 포함하는 것을 잊지 마십시오.
...
string connectionString = @"Data Source=YADDAYADDA;Initial Catalog=MUMBLEMUMBLE;Integrated Security=True";
var pointsFileDc = new PointsFileDC(connectionString);
var geos = (from point in pointsFileDc.pointsData
select point).Take(10);
foreach (var geo in geos)
{
ObjectDumper.Write(geo);
}
...
public class PointsFileDC : DataContext
{
public Table<GeoPoints> pointsData;
public PointsFileDC(string connection)
: base(connection)
{
}
}
[Table(Name = "Points")]
public class GeoPoints
{
[Column(IsPrimaryKey = true)]
public int PointId;
[Column]
public SqlGeography GeoPoint;
}