20

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

4

3 回答 3

24

这是使其在 Entity Framework / LINQ to Entities 中工作的解决方法:

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

这是一个用于构建视图的示例查询,该视图将几何类型的“位置”字段转换为众所周知的文本字符串:

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 空间类型的优雅,但它会让您同时运行实体框架和 SQL 空间类型。

于 2009-11-25T15:01:36.223 回答
11

在 EF 4.0 中,您可能能够使用自定义函数的组合将某些东西组合在一起,并假装空间类型是真正的二进制类型。这是我正在考虑解决和尝试并添加到我的技巧系列的东西。但到目前为止,即使是黑客攻击也未经证实。:(

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

亚历克斯·詹姆斯

实体框架项目经理。

于 2009-08-23T20:51:29.590 回答
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;
}
于 2010-11-02T16:53:07.720 回答