2009-12-12 39 views
5

Vì vậy, LINQ không hỗ trợ loại dữ liệu Geography, loại này ném một cờ lê chính vào các công trình trong bảng kéo 'đáng yêu' lên mô hình phát triển bề mặt thiết kế LINQ.LINQ & kiểu dữ liệu không được hỗ trợ (Địa lý)

Có cách nào để tôi có thể mở rộng LINQ để hoạt động với kiểu dữ liệu Địa lý không? Hoặc tôi có cần xây dựng một bộ dữ liệu và tập hợp các truy vấn mới cho bất cứ khi nào tôi cần sử dụng cột Địa lý không?

Tôi đã gặp vấn đề này trong một vài ngày và không thể giải quyết nếu có thể.

Trả lời

1

Looks like bạn sẽ phải tự vẽ/phân tích cú pháp chính nó thành loại POCO của riêng bạn.

3

Truyền cột thành biến thể (tối đa), mà LINQ to SQL có thể xử lý. Một cách để tránh làm điều này trong mỗi truy vấn chỉ là thêm cột được tính được định nghĩa là CAST(GeographyColumn AS varbinary(max)).

Một khi bạn có dữ liệu byte[], bạn có thể viết một phương pháp hữu ích ngắn để chuyển đổi nó vào lớp học thực tế Microsoft.SqlServer.Types.SqlGeography sử dụng một MemoryStreamIBinarySerialize. Read/Write phương pháp. Theo tôi biết, đây là giải pháp làm việc duy nhất nếu bạn cần làm việc với bất kỳ loại CLR nào, bao gồm địa lý, hình học, phân cấp và bất kỳ loại tùy chỉnh nào - LINQ không "hỗ trợ" bất kỳ loại nào trong số chúng. Đó là một chút đau đớn để viết tất cả các mã boilerplate, nhưng bạn có thể làm cho nó dễ dàng hơn với một vài phương pháp mở rộng.

Bạn sẽ không thể truy vấn đối với cột theo cách này; tuy nhiên, bạn có thể nhận được những gì tôi sẽ gọi một nửa ở đó bằng cách sử dụng Linq Dynamic Query Library. Bạn sẽ không có intellisense hoặc một số goodies LINQ khác, nhưng nó vẫn composable và do đó tốt hơn so với tay crafting mỗi truy vấn, và bạn có thể nhận được kết quả mạnh mẽ đánh máy.

Cập nhật: Tôi tìm thấy giải pháp hơi sạch hơn here. Bạn có thể sử dụng nhà thiết kế theo cách này; chỉ cần thêm thuộc tính bao bọc SqlGeography vào một lớp học một phần và sử dụng phương thức STGeomFromWKB với lớp SqlBytes. Tuy nhiên, điều đó vẫn sẽ không cung cấp cho bạn khả năng truy vấn nội tuyến.

+0

Ok, nhưng điều đó sẽ không làm gì để giúp tôi chạy các truy vấn không gian? Ý tôi là, tôi vẫn sẽ phải tạo ra các truy vấn của riêng mình nếu tôi muốn làm những điều như 'SELECT X WHERE Y.STIntersects (X)' –

+0

Vâng, bạn sẽ không may - ngay cả khi có cách tốt hơn để dỗ Linq để SQL chấp nhận kiểu CLR như một cột, nó vẫn sẽ không biết cách ánh xạ các phương thức của nó thành các cuộc gọi hàm SQL. Đặt cược của bạn tốt nhất là viết các truy vấn này dưới dạng SP hoặc UDF trong SQL Server, nhưng nếu bạn hoàn toàn phải viết SQL trong ứng dụng, thì bạn có thể có được những gì bạn muốn bằng cách sử dụng Thư viện truy vấn động LINQ. – Aaronaught

+0

Tôi đã cập nhật câu trả lời bằng liên kết trong trường hợp bạn không quen với DynamicQuery. – Aaronaught

Các vấn đề liên quan