1

是否可以使用实体框架对 geom 数据类型执行 sqlite intersect 查询?

我在下面的 SQLiteConnection 上取得了成功(加载'libspatialite-4.dll'之后)

string query = @"SELECT * FROM Spatial_Table WHERE intersects(Geom, GeomFromText('LINESTRING (-69.929201602936 23.577301964831, -20.358889102936 37.730080532218, 4.6020483970643 55.586555530742)', 4326)) = 1"

我已经成功使用 EF 从我的 SQLite 数据库中查询非空间数据。

这种查询可能吗?我可以加载dll吗?

非常感谢

4

2 回答 2

4

我认识的派对有点晚了(我只是发现了这一点),但公认的答案并不完全正确。

事实是 EF 中没有 Geometry 和/或 Geography 类型来支持这一点,但有一种方法可以绕过它。

首先开...

您可以在数据库上下文中使用 ExecuteSqlCommand 加载扩展 DLL,如下所示:

_ctx.Database.ExecuteSqlCommand(@"SELECT load_extension('libspatialite-4.dll')");

其次,如果您将几何返回为二进制而不是文本,则可以将数据从数据库中作为常规返回

byte[] 

数据类型。在您熟悉 NuGet 并安装“.NET 拓扑套件”(简称 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 中添加的),它允许您在给定表上运行数据读取器样式查询并利用您的强类型模型来获取数据背部。

于 2013-02-24T00:41:29.327 回答
3

很不幸的是,不行。

System.Data.SQLite 提供程序和devArt的 dotConnect for SQLite 提供程序目前都不支持空间(几何、地理)类型。

于 2012-12-18T19:01:40.827 回答