2012-03-12 106 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