[英]c# Entity Framework sqlite (spatialite) spatial date
是否可以使用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中没有支持此功能的Geometry和/或Geography类型,但是有一种解决方法。
首先...
您可以使用ExecuteSqlCommand在数据库上下文中加载扩展DLL,如下所示:
_ctx.Database.ExecuteSqlCommand(@"SELECT load_extension('libspatialite-4.dll')");
其次,如果将Geometry作为二进制而不是文本返回,则可以将数据作为常规数据从数据库中带回。
byte[]
数据类型。 直到您对NuGet有所了解并安装“ .NET Topology Suite”(简称NTS),这似乎有点适得其反。
您可以将这些二进制数组输入到NTS中,它将构造并返回代表您的几何图形的第一类.NET对象。 NTS基本上具有Spatialite所具有的所有内容,但仅包含C#程序集。 实际上,我什至可以说,使用NTS,您实际上不需要spacespaceite,您只需将二进制数组保存到数据库中或从数据库中检索二进制数组,然后纯粹在自己的代码中对其进行操作。
用这种方法做的唯一丢失的事情就是能够执行SQL,例如select语句以从数据库中搜索几何。
但是不要害怕。
为此,您可以将结果作为常规的地理文本对象(例如,
POINT(1 2)
要么
LINE(1 2,3 4,5 6,7 8)
您需要做的就是通过将结果传递给Spatialites“ AsText”函数来确保执行的所有SQL查询的结果都能创建输出。
所以用你的例子
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中添加了),该函数可让您在给定表上运行数据读取器样式的查询并利用强类型模型来获取数据背部。
抱歉不行。
System.Data.SQLite提供程序或devArt的dotConnect for SQLite提供 程序目前都不支持空间(几何,地理)类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.