Подтвердить что ты не робот

Поддержка пространственных данных в Linq2Sql или EF4

Кто-нибудь знает (в идеале, с ссылкой), будет ли версия VS2010 LinqToSQL или EntityFramework v4 поддерживать запросы по пространственным типам данных SQL 2008?

4b9b3361

Ответ 1

В EF 4.0 вы можете взломать что-то вместе, используя комбинацию пользовательских функций и притворяясь, что пространственные типы действительно бинарные типы. Это то, о чем я сейчас думаю, обманывая и опробовав и добавляя в мою серию советов. Но пока даже хак не доказан.: (

А для прямой поддержки, к сожалению, ни L2S, ни EF v4 не будут поддерживать пространственные типы в VS2010 таймфрейме.

Алекс Джеймс

Диспетчер программ Entity Framework.

Ответ 2

Вот обходной путь, чтобы заставить его работать в Entity Framework/LINQ to Entities:

Вы можете использовать представление базы данных, чтобы вернуть Well-Known-Text (используя "geometry.ToString()" в запросе) или Binary. Затем, как только результирующие строки будут возвращены, просто преобразуйте строку/двоичный объект в объект SqlGeometry в .NET.

Вот пример запроса, который использовался для создания представления, которое преобразует поле "Местоположение" типа геометрии в строку "Хорошо известный текст":

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

Здесь приведен пример запроса результирующих объектов, которые имеют поле "Местоположение", которое содержит хорошо известное текстовое или строковое представление объекта "география":

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

Еще одна вещь: вам нужно делать любые пространственные запросы в хранимых процедурах, так как вы не хотите вытаскивать ВСЕ данные из таблицы в .NET, чтобы выполнить свой собственный пространственный запрос с помощью LINQ.

Это не является элегантным, поскольку он поддерживает SQL Spatial Types, но он заставит вас работать с Entity Framework и SQL Spatial одновременно.

Ответ 3

Вы также можете выполнить Linq-to-SQL с помощью написанных вручную таблиц и столбцов и напрямую получить пространственные типы SQL. Я проверил следующее на примере DB (не забывайте включать ссылку и "использовать" в 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;
}