2009-08-21 4 views

Répondre

11

Dans EF 4.0, vous pourriez être en mesure de pirater quelque chose ensemble en utilisant une combinaison de custom functions et en prétendant que les types spatiaux sont vraiment des types binaires. C'est quelque chose que je pense à faire et à essayer et à ajouter à my tips series. Mais encore, même le hack n'est pas prouvé. :(

Et comme pour un soutien direct, malheureusement ni L2S ou EF v4 soutiendra les types spatiaux dans les délais VS2010.

Alex James

Entity Framework Manager du programme.

+0

Merci Alex , semble être une réponse fiable et définitive! Existe-t-il une raison particulière EF4 ne les soutiendra pas (trop fort, pas assez de demande, trop peu prioritaire ..?) –

+2

Eh bien, je ne vais pas dire une trop faible priorité. Je considère que c'est une haute priorité, mais je dirais que ce n'était pas aussi élevé que certaines des choses que nous avons fini par faire, comme POCO, F Ks, Model First, etc. –

+2

Quand EF aura-t-il un support de type spatial? VS'2012; seulement 4 ans après ils ont été ajoutés à SQL Server ?? –

24

Voici une solution de contournement pour obtenir il fonctionne dans Entity Framework/LINQ to Entities:

Vous pouvez utiliser une base de données View pour retourner Well-Known-Text (en utilisant "geometry.ToString()" dans la requête) ou binaire. les lignes sont retournées, il suffit de convertir la chaîne/binaire en un objet SqlGeometry dans .NET.

Voici une exemple de requête utilisé pour construire une vue qui convertit un « emplacement » champ de type de géométrie à une chaîne de texte bien connu:

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

Voici un exemple d'interroger les entités résultantes qui ont un champ « Lieu » qui contient un texte bien connu ou représentation chaîne de l'objet « géographie »:

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; 
} 

une chose supplémentaire, est que vous aurez besoin de faire des questions sur la base de l'espace dans les procédures stockées, puisque vous ne veut pas tirer toutes les données de la table dans .NET afin d'effectuer votre propre requête spatiale en utilisant LINQ. Il ne s'agit pas d'un support de type SQL Spatial, mais il vous permettra de lancer simultanément Entity Framework et SQL Spatial.

+0

Excellent, merci beaucoup Chris. Je vais jeter un coup d'oeil à ça! –

+0

Cela a été quelque chose que j'ai joué/fait avec L2S. –

+0

Merci beaucoup :) –

1

Vous pouvez également effectuer des Linq-to-SQL avec des tables et des colonnes manuscrites et obtenir directement les types spatiaux SQL. Je l'ai testé ce qui suit sur un échantillon DB (ne vous oubliez pas de faire référence et 'à l'aide' à 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; 
} 
Questions connexes