2009-08-21 12 views

risposta

11

In EF 4.0 potresti riuscire a modificare qualcosa usando una combinazione di custom functions e fingere che i tipi spaziali siano in realtà tipi binari. Questo è qualcosa che sto pensando di masticare, provare e aggiungere a my tips series. Ma finora anche l'hack non è stato provato. :(

E per quanto riguarda il sostegno diretto, purtroppo né L2S o EF v4 sosterrà tipi spaziali nei tempi VS2010.

Alex James

Entity programma quadro Manager.

+0

Grazie Alex , sembra una risposta affidabile e definitiva! C'è qualche ragione particolare per cui EF4 non li supporterà (troppo difficile, non abbastanza richiesta, priorità troppo bassa ..?) –

+2

Beh, non ho intenzione di dire una priorità troppo bassa. Lo considero un'alta priorità, ma dirò che non era all'altezza di alcune delle cose che abbiamo finito, come POCO, F Ks, Model First ecc. –

+2

Quando EF avrà il supporto di tipo spaziale ?? VS'2012; solo 4 anni dopo che sono stati aggiunti a SQL Server ?? –

24

Ecco una soluzione per ottenere funziona in Entity Framework/LINQ in Entities:

È possibile utilizzare una vista del database per restituire il testo ben noto (utilizzando "geometry.ToString()" nella query) o binario. le righe vengono restituite, basta convertire la stringa/binario in un oggetto SqlGeometry in .NET.

Ecco una query di esempio utilizzato per costruire una vista che converte un campo "Location" del tipo di geometria in una stringa Well-Known-Text:

SELECT ID, Name, Location.ToString() as Location FROM MyTable 

Ecco un esempio di interrogazione dei soggetti risultanti che hanno un campo "Location" che contiene un noto-Text o la rappresentazione String dell'oggetto "geografia":

var e = new MyApp.Data.MyDataEntities(connectionString); 
var items = from i in e.MyTables 
      select i; 

foreach (var i in items) 
{ 
    // "Location" is the geography field 
    var l = SqlGeography.Parse(i.Location); 
    var lat = l.Lat; 
    var lng = l.Long; 
} 

una cosa aggiuntiva, è avrete bisogno di fare query basate qualsiasi spaziali all'interno di stored procedure, dal momento che non voglio tirare TUTTI i dati dalla tabella in .NET per eseguire la tua query spaziale utilizzando LINQ.

Questo non è un elegent come supporto nativo di SQL Spatial Types, ma vi farà funzionare contemporaneamente con Entity Framework e SQL Spatial.

+0

Eccellente, grazie mille Chris. Darei un'occhiata a questo! –

+0

Questo è stato qualcosa che ho giocato/fatto, con L2S. –

+0

Grazie mille :) –

1

Si può anche fare sicuramente Linq-to-SQL con tabelle e colonne scritte a mano e ottenere direttamente i tipi spaziali SQL. Ho provato quanto segue su un DB campione (dont' dimenticare di includere il riferimento e 'usando' a System.SqlServer.Types

...

string connectionString = @"Data Source=YADDAYADDA;Initial Catalog=MUMBLEMUMBLE;Integrated Security=True"; 
var pointsFileDc = new PointsFileDC(connectionString); 
var geos = (from point in pointsFileDc.pointsData 
      select point).Take(10); 
foreach (var geo in geos) 
{ 
    ObjectDumper.Write(geo); 
} 

...

public class PointsFileDC : DataContext 
{ 
    public Table<GeoPoints> pointsData; 
    public PointsFileDC(string connection) 
     : base(connection) 
    { 
    } 
} 

[Table(Name = "Points")] 
public class GeoPoints 
{ 
    [Column(IsPrimaryKey = true)] 
    public int PointId; 
    [Column] 
    public SqlGeography GeoPoint; 
}