Linq to sql Linq2Sql或EF4中支持的空间数据类型

Linq to sql Linq2Sql或EF4中支持的空间数据类型,linq-to-sql,entity-framework,spatial,Linq To Sql,Entity Framework,Spatial,有人知道(理想情况下,有参考资料)LinqToSQL或EntityFramework v4的VS2010版本是否支持对SQL 2008空间数据类型的查询吗?在EF 4.0中,您可以使用空间类型的组合并假装空间类型是真正的二进制类型。这是一件我正在考虑的事情,我想尝试一下,并加入其中。但迄今为止,即使是黑客行为也未经证实( 至于直接支持,不幸的是L2S或EF v4在VS2010时间范围内都不支持空间类型 实体框架项目经理。这里有一个解决方法,可以让它在实体框架/LINQ中工作: 您可以使用数据库

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

在EF 4.0中,您可以使用空间类型的组合并假装空间类型是真正的二进制类型。这是一件我正在考虑的事情,我想尝试一下,并加入其中。但迄今为止,即使是黑客行为也未经证实(

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


实体框架项目经理。

这里有一个解决方法,可以让它在实体框架/LINQ中工作:

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

下面是一个示例查询,用于构建将几何体类型的“位置”字段转换为已知文本字符串的视图:

SELECT ID, Name, Location.ToString() as Location FROM MyTable
下面是一个查询结果实体的示例,该实体具有“位置”字段,该字段包含“地理”对象的已知文本或字符串表示形式:

另外一件事是,您需要在存储过程中执行任何基于空间的查询,因为您不希望为了使用LINQ执行您自己的空间查询而将表中的所有数据拉入.NET


这并不是一个本机支持SQL空间类型的elegent,但它可以让您同时使用Entity Framework和SQL Spatial运行。

您也可以使用手写的表和列执行Linq to SQL,并直接获得SQL空间类型。我在一个示例数据库上测试了以下内容(不要忘记包括对System.SqlServer.Types的引用和“使用”)

公共类点FileDC:DataContext
{
公共表点数据;
公共点文件DC(字符串连接)
:底座(连接)
{
}
}
[表(Name=“Points”)]
公共级地质点
{
[列(IsPrimaryKey=true)]
公共int-PointId;
[专栏]
公共地理点;
}

谢谢Alex,这似乎是一个可靠而明确的答案!EF4不支持它们有什么特别的原因吗(太难、需求不足、优先级太低……)我不会说太低的优先权。我认为这是一个高优先级。但是我会说它并不像我们所做的一些事情那么高,比如POCO、FKS、模型首等。EF什么时候得到空间类型支持??VS’2012;在添加到SQL Server之后只有4年??作为注释,EF 5支持空间数据类型。不确定WHEVE。r如果这适用于MySQL或其他DB提供商。太好了,非常感谢Chris。我来看看这个!这是我一直在玩/做的L2S游戏。我们将这些东西存储为Lat/Lng float列,并使用触发器创建地理列值。这让我们有两种方式-获取/设置的类型,以及SPs中的空间查询。
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;
}
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;
}