2013-02-27 52 views
16

Có thể tôi đang thiếu điều gì đó. Tôi có một cột máy chủ sql của kiểu dữ liệu "Địa lý".sql geography để dbgeography?

Tôi muốn sử dụng loại DbGeography trong mã C# của mình. Bất kỳ cách nào để truyền hoặc chuyển đổi từ địa lý của sql sang dbgeography?

Trả lời

24

Xin lỗi vì phản hồi muộn - nhưng đã thấy điều này trong khi tìm kiếm nội dung khác.

Đơn giản chỉ cần làm như sau:

SqlGeography theGeography; 
int srid = 4326; // or alternative 

DbGeography newGeography = DbGeography.FromText(theGeography.ToString(), srid); 

Để đảo ngược nó:

DbGeography theGeography; 
SqlGeography newGeography = SqlGeography.Parse(theGeography.AsText()).MakeValid(); 

Hy vọng rằng sẽ giúp!

+0

Tôi thực sự đang ở trên một dự án khác, nơi điều này đã trở lại một lần nữa, vì vậy cảm ơn, chỉ là những gì tôi đang tìm kiếm. – radpin

+0

Tôi đã thấy đề xuất này một vài lần nhưng phương pháp MakeValid dường như không có sẵn trên loại SqlGeography khi được sử dụng trong .NET. Tui bỏ lỡ điều gì vậy? – joelmdev

+0

@ jm2 nếu bạn đã tham chiếu Microsoft.SqlServer.Types nó sẽ có sẵn cho bạn. –

1

Giải pháp được cung cấp có vẻ ổn nếu bạn không chạy EF6. Với phiên bản đầu tiên ok, nhưng với EF6, chúng tôi không nên tham chiếu đến hội đồng này. Biến EF trở nên điên cuồng.

+0

Bạn có thể cụ thể hơn không? Chính xác điều gì xảy ra và giải pháp chính xác là gì? – grahamesd

+1

Đối với bất cứ ai khác đọc sách này, tôi vẫn sử dụng giải pháp được cung cấp của tôi với EF6 với ** số không **. –

1

Bạn phải thêm tham chiếu vào các hội đồng như đã đề cập ở trên. Các bài sau đây có thể giúp bạn link, link2

8

Khi việc thực hiện được của bất kỳ quan trọng, nhị phân nổi tiếng nên được sử dụng thay cho văn bản nổi tiếng:

var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value); 

Có một tình trạng quá tải sử dụng SRID, nếu điều đó quan trọng. Trong thử nghiệm đơn giản của tôi với một 1.000 đa giác một cách hợp lý phức tạp phương pháp nhị phân dựa trên là nhanh hơn 4 lần so với các văn bản dựa trên một:

* Binary-based conversion 
Run 1: 1948 
Run 2: 1944 
Run 3: 1959 
Run 4: 1979 
Run 5: 1988 
Average: 1963.6 

* Text-based conversion 
Run 1: 8527 
Run 2: 8553 
Run 3: 8596 
Run 4: 8535 
Run 5: 8496 
Average: 8541.4 
+0

Cập nhật tuyệt vời, cách tuyệt vời để tăng hiệu suất. – radpin

+1

Đối với hoạt động ngược lại: 'SqlGeography.STGeomFromWKB (new SqlBytes (value.AsBinary()), value.CoordinateSystemId)' –

0

Tôi thấy điều này như một giải pháp làm việc:

int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326; 
SqlGeography g = SqlGeography.Point(lat, lon, coordSys); 
return DbSpatialServices.Default.GeographyFromProviderValue(g); 

Không serializing/chuyển đổi thành chuỗi (WKT) hoặc nhị phân (WKB) để giết hiệu suất.

Nó đang làm việc cho tôi trên EF 6.1.3, SQLServer 2016 SP1 và Microsoft.SqlServer.Types.14.0.314.76

+0

Tôi sẽ thêm rằng nếu bạn đang sử dụng SqlGeography lớn hơn v10 (SQL 2008), thì phương thức này sẽ ném một lỗi, có nghĩa là nếu bạn cần bất kỳ tính năng nào của SQL 2012 trở lên, bạn sẽ bị hỏng. Hiệu suất là tốt mặc dù. –

+0

Tôi sẽ giả sử không có phương pháp ngược lại? –

+0

Phải có phương pháp đảo ngược. Không thể nói ngay bây giờ. –

1

Dựa trên cách đọc của tôi về EntityFramework.SqlServer.dll trong ILSpy, tôi tin rằng cách nhanh nhất để chuyển đổi từ SqlGeography sang DbGeography là:

var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo); 

Phương pháp này có lợi thế là không cần chuyển đổi nhị phân và phân tích cú pháp. Nó đơn giản trả về một DbGeography sử dụng SqlGeography làm giá trị nhà cung cấp nội bộ.