gpt4 book ai didi

c# Entity Framework sqlite (spatialite) 空间日期

转载 作者:太空宇宙 更新时间:2023-11-03 18:36:57 25 4
gpt4 key购买 nike

是否可以使用 Entity Framework 对 geom 数据类型执行 sqlite 相交查询?

我在下面的 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 吗?

非常感谢

最佳答案

我知道的聚会有点晚了(我才刚刚发现这一点)但接受的答案并不严格正确。

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

首先……

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

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

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

byte[] 

数据类型。在您了解 NuGet 并安装“.NET Topology Suite”(简称 NTS)之前,这似乎有点适得其反

您可以将这些二进制数组输入 NTS,它会构建并返回一个代表您的几何图形的一流 .NET 对象。 NTS 基本上包含了 Spatialite 的所有内容,只是在 C# 程序集中。事实上,我什至可以说,对于 NTS,您实际上不需要 spatialite,您只需将二进制数组保存到数据库或从数据库检索二进制数组,然后完全在您自己的代码中对其进行操作。

以这种方式做事时,您唯一会失去的是执行类似于 select 语句的 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 中添加的),它允许您在给定表上运行数据读取器样式查询并利用您的强类型模型,以取回数据。

关于c# Entity Framework sqlite (spatialite) 空间日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com