2009-12-12 5 views
5

Quindi, Linq non supporta il tipo di dati Geography, che getta uno strumento chiave nelle opere nella deliziosa tabella di trascinamento sul modello di sviluppo della superficie di design Linq.Linq e tipi di dati non supportati (Geografia)

È possibile estendere Linq per lavorare con il tipo di dati Geography? O dovrò creare un nuovo datalayer e una serie di query per ogni volta che ho bisogno di usare le colonne di Geography?

Sono stato bloccato su questo per alcuni giorni e non riesco a capire se è possibile.

risposta

1

Looks like dovrai mapparlo/analizzarlo manualmente sul tuo tipo POCO.

3

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.

+0

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)' –

+0

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

+0

Ho aggiornato la risposta con un link nel caso in cui non abbia familiarità con DynamicQuery. – Aaronaught