Кто-нибудь знает (в идеале, с ссылкой), будет ли версия VS2010 LinqToSQL или EntityFramework v4 поддерживать запросы по пространственным типам данных SQL 2008?
Поддержка пространственных данных в Linq2Sql или EF4
Ответ 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;
}