我认识的聚会有点晚了(我只是发现了这一点),但公认的答案并不完全正确。
事实是,EF 中没有 Geometry 和/或 Geography 类型来支持这一点,但有一种方法可以绕过它。
首先...
您可以在数据库上下文中使用 ExecuteSqlCommand 加载扩展 DLL,如下所示:
_ctx.Database.ExecuteSqlCommand(@"SELECT load_extension('libspatialite-4.dll')");
其次,如果您将几何图形作为二进制而不是文本返回,则可以将数据作为常规从数据库中取回
byte[]
数据类型。在您熟悉 NuGet 并安装“.NET Topology Suite”(简称 NTS)之前,这似乎有点适得其反
您可以将这些二进制数组输入到 NTS 中,它会构造并返回代表您的几何图形的第一类 .NET 对象。 NTS 基本上包含 Spatialite 的所有内容,但在 C# 程序集中。事实上,我什至可以说,使用 NTS,您实际上不需要空间数据,您只需在数据库中保存和检索二进制数组,然后纯粹在您自己的代码中对它们进行操作。
这样做你唯一失去的就是执行 SQL 之类的选择语句以从数据库中搜索几何图形的能力。
但不要害怕......
为此,您可以将结果作为常规地理文本对象返回到代码中,例如
POINT(1 2)
或
LINE(1 2,3 4,5 6,7 8)
您需要做的就是确保您执行的任何 SQL 查询的结果通过 Spatialites“AsText”函数传递结果来创建它们的输出。
所以用你的例子
string query = @"SELECT col1,col2,col3,AsText(GeometryColumn) FROM Spatial_Table WHERE intersects(Geom, GeomFromText('LINESTRING (-69.929201602936 23.577301964831, -20.358889102936 37.730080532218, 4.6020483970643 55.586555530742)', 4326)) = 1"
这会产生类似的东西:
1,2,3,POINT(1 2)
4,5,6,POINT(3 4)
1,2,3,POINT(1 2)
4,5,6,POINT(3 4)
您可以将其输入到普通的 .NET 对象中,如下所示:
public class myclass
{
public int col1 { get; set; }
public int col2 { get; set; }
public int col3 { get; set; }
public string GeometryColumn { get; set; }
}
再一次,如果您随后使用 NTS,NTS 可以解析并转换为图形对象从 Spatialite 在文本字符串中传递的任何内容。
我的公司在我们的一款旗舰产品中非常可靠地使用了这些技术,自 EF 4.3 以来我们一直这样做。
ExecuteSqlCommand刚刚出现在EF5中,但在之前的版本中还有其他类似的任意SQL语句执行方式。
您还会发现,在您的实体表上,有一个名为 SqlQuery 的新函数(我相信是在 EF5 中添加的),它允许您在给定表上运行数据读取器样式查询并利用您的强类型模型,以取回数据。