Trasferire la colonna in un varbinary (max), che da Linq a SQL può gestire. Un modo per evitare di farlo in ogni query è solo aggiungere una colonna calcolata definita come CAST(GeographyColumn AS varbinary(max))
.
Una volta che hai i dati byte[]
, è possibile scrivere un metodo di utilità breve per convertirlo alla classe reale Microsoft.SqlServer.Types.SqlGeography
utilizzando un MemoryStream
e IBinarySerialize
. Metodi Read
/Write
.
Per quanto ne so, questa è l'unica soluzione di lavoro se avete bisogno di lavorare con qualsiasi tipo CLR, tra cui la geografia, la geometria, hierarchyid, e qualsiasi tipi personalizzati - Linq non "nativamente" sostenere nessuno di essi. È un po 'difficile scrivere tutto il codice boilerplate, ma puoi renderlo più semplice con alcuni metodi di estensione.
Non è possibile interrogare la colonna in questo modo; tuttavia, è possibile ottenere ciò che chiamerei a metà strada utilizzando lo Linq Dynamic Query Library. Non avrai intellisense o alcune delle altre chicche di Linq, ma è ancora componibile e quindi migliore della creazione manuale di ogni query, e puoi ottenere risultati fortemente tipizzati.
Aggiornamento: Ho trovato una soluzione leggermente più pulita here. Puoi usare il designer in questo modo; è sufficiente aggiungere la proprietà wrapper SqlGeography
a una classe parziale e utilizzare il metodo STGeomFromWKB
con la classe SqlBytes
. Ciò non ti darà comunque capacità di query inline.
Ok, ma questo non farà nulla per aiutarmi a eseguire query spaziali, vero? Voglio dire, dovrei comunque creare le mie query se volessi scrivere a "SELECT X WHERE Y.STIntersects (X)' –
Sì, lo farai, sfortunatamente - anche se ci fosse un modo migliore per convincere Linq a SQL per accettare il tipo CLR come colonna, non saprebbe ancora come mappare i suoi metodi in chiamate di funzione SQL. La soluzione migliore è scrivere queste query come SP o UDF in SQL Server stesso, ma se si deve assolutamente scrivere il codice SQL all'interno dell'app, è possibile ottenere ciò che si desidera utilizzando la libreria di query dinamica Linq. – Aaronaught
Ho aggiornato la risposta con un link nel caso in cui non abbia familiarità con DynamicQuery. – Aaronaught