2012-03-12 108 views
1

因此,從我讀的地理SQL類型不支持實體框架。GPS座標與實體框架和LINQ

我想知道如果有人有解決我遇到的問題。我有一個C#類,它有一些使用實體框架和LINQ的數據訪問方法。 這些方法正在將GPS座標傳遞給它們。數據庫(和實體框架類型)具有經緯度字段,在創建行時填充這些字段。這一切工作正常。

我想要做的是讓我的LINQ查詢拉回給定的GPS座標附近(在半徑內)的行。我不想開始使用存儲過程,因爲這將會改變架構。

有沒有人有任何想法呢?我正在爲創意掙扎。

回答

1

如果你想利用你的數據庫空間索引(這將允許快速空間查詢),你應該在你的表格中存儲你的位置爲Geography(如果你想訪問你也可以保留當前的緯度/經度列到這個值)。

由於實體框架目前不支持Geography類型/函數,恐怕您唯一的選擇是編寫一個內部調用STDistance(如果您使用SQL Server 2008 R2)的存儲過程。老實說,由於空間函數實際上取決於數據庫(STDistance僅適用於SQL Server 2008 R2),所以爲您的特定用例存儲過程並不是一個壞主意。

+0

從EF5開始,添加了對DbGeography的支持。看到我的答案。 – 2016-07-24 18:45:24

2

接受的答案已過時。 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.

whole article and video here.

+0

感謝兄弟.... – SHM 2016-11-23 14:47:24