有人知道(最好有参考资料),VS2010版本的LinqToSQL或EntityFramework v4是否支持针对SQL 2008空间数据类型的查询吗?
有人知道(最好有参考资料),VS2010版本的LinqToSQL或EntityFramework v4是否支持针对SQL 2008空间数据类型的查询吗?
这是一个绕过的方法,用于在Entity Framework / LINQ to Entities中实现功能:
你可以使用数据库视图来返回Well-Known-Text(在查询中使用“geometry.ToString()”)或二进制。然后一旦返回结果行,只需在.NET中将字符串/二进制转换为SqlGeometry对象即可。
以下是用于构建视图的示例查询,将几何类型的“Location”字段转换为Well-Known-Text字符串:
SELECT ID, Name, Location.ToString() as Location FROM MyTable
以下是一个示例,演示如何查询具有包含“地理”对象的Well-Known-Text或字符串表示形式的“位置”字段的结果实体:
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。
你也可以使用手写的表和列来进行 Linq-to-SQL,并直接获取 SQL 空间类型。我在一个样本数据库上测试了以下内容(不要忘记包含对 System.SqlServer.Types 的引用和“using”)。
...
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;
}