因此,從我讀的地理SQL類型不支持實體框架。GPS座標與實體框架和LINQ
我想知道如果有人有解決我遇到的問題。我有一個C#類,它有一些使用實體框架和LINQ的數據訪問方法。 這些方法正在將GPS座標傳遞給它們。數據庫(和實體框架類型)具有經緯度字段,在創建行時填充這些字段。這一切工作正常。
我想要做的是讓我的LINQ查詢拉回給定的GPS座標附近(在半徑內)的行。我不想開始使用存儲過程,因爲這將會改變架構。
有沒有人有任何想法呢?我正在爲創意掙扎。
因此,從我讀的地理SQL類型不支持實體框架。GPS座標與實體框架和LINQ
我想知道如果有人有解決我遇到的問題。我有一個C#類,它有一些使用實體框架和LINQ的數據訪問方法。 這些方法正在將GPS座標傳遞給它們。數據庫(和實體框架類型)具有經緯度字段,在創建行時填充這些字段。這一切工作正常。
我想要做的是讓我的LINQ查詢拉回給定的GPS座標附近(在半徑內)的行。我不想開始使用存儲過程,因爲這將會改變架構。
有沒有人有任何想法呢?我正在爲創意掙扎。
如果你想利用你的數據庫空間索引(這將允許快速空間查詢),你應該在你的表格中存儲你的位置爲Geography
(如果你想訪問你也可以保留當前的緯度/經度列到這個值)。
由於實體框架目前不支持Geography
類型/函數,恐怕您唯一的選擇是編寫一個內部調用STDistance
(如果您使用SQL Server 2008 R2)的存儲過程。老實說,由於空間函數實際上取決於數據庫(STDistance
僅適用於SQL Server 2008 R2),所以爲您的特定用例存儲過程並不是一個壞主意。
接受的答案已過時。 EF5引入了API來處理空間數據。這裏是MSDN的一個例子;
模型
using System.Data.Spatial; //For EF5
//using System.Data.Entity.Spatial; //For EF6
public class University
{
public int UniversityID { get; set; }
public string Name { get; set; }
public DbGeography Location { get; set; }
}
的DbContext
using System.Data.Entity;
public partial class UniversityContext : DbContext
{
public DbSet<University> Universities { get; set; }
}
保持和檢索數據
using (var context = new UniversityContext())
{
context.Universities.Add(new University()
{
Name = "Graphic Design Institute",
Location = DbGeography.FromText("POINT(-122.336106 47.605049)"),
});
context. Universities.Add(new University()
{
Name = "School of Fine Art",
Location = DbGeography.FromText("POINT(-122.335197 47.646711)"),
});
context.SaveChanges();
var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)");
var university = (from u in context.Universities
orderby u.Location.Distance(myLocation)
select u).FirstOrDefault();
Console.WriteLine(
"The closest University to you is: {0}.",
university.Name);
}
上述查詢的結果應該是The closest University to you is: School of Fine Art.
感謝兄弟.... – SHM 2016-11-23 14:47:24
從EF5開始,添加了對DbGeography的支持。看到我的答案。 – 2016-07-24 18:45:24