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 MemoryStream
và IBinarySerialize
. 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.
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)' –
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
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