Поддержка пространственных типов данных в Linq2Sql или EF4 - PullRequest
20 голосов
/ 22 августа 2009

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

Ответы [ 3 ]

24 голосов
/ 25 ноября 2009

Вот обходной путь, чтобы заставить его работать в 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, но позволяет одновременно работать с Entity Framework и SQL Spatial.

11 голосов
/ 24 августа 2009

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

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

Алекс Джеймс

Менеджер программ Entity Framework.

1 голос
/ 02 ноября 2010

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