Linq2Sql或EF4中支持空间数据类型

时间:2009-08-21 22:47:55

标签: linq-to-sql entity-framework spatial

有没有人知道(理想情况下,参考一下),LinqToSQL或EntityFramework v4的VS2010版本是否支持SQL 2008空间数据类型的查询?

3 个答案:

答案 0 :(得分:24)

这是让它在Entity Framework / LINQ to Entities中运行的解决方法:

您可以使用数据库视图返回Well-Known-Text(在查询中使用“geometry.ToString()”)或Binary。然后,一旦返回结果行,只需将字符串/二进制文件转换为.NET中的SqlGeometry对象。

以下是用于构建View的示例查询,该View将几何类型的“Location”字段转换为Well-Known-Text字符串:

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

这是一个查询结果实体的示例,这些实体具有“Location”字段,该字段包含“geography”对象的Well-Known-Text或String表示:

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。

答案 1 :(得分:11)

在EF 4.0中,您可以使用custom functions的组合来一起破解某些内容,并假装空间类型实际上是二进制类型。这是我正在考虑的事情,并尝试并添加到my tips series。但到目前为止,即使是黑客也未经证实。 :(

至于直接支持,遗憾的是,在VS2010时间范围内,L2S或EF v4都不支持空间类型。

Alex James

实体框架计划经理。

答案 2 :(得分:1)

您也可以使用手写的表和列来执行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;
}