[英]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.