C# 具有实体框架和LINQ的GPS坐标

C# 具有实体框架和LINQ的GPS坐标,c#,.net,linq,entity-framework,gps,C#,.net,Linq,Entity Framework,Gps,因此,据我所知,实体框架中还不支持地理SQL类型 我想知道是否有人能解决我的问题。我有一个c#类,它有一些使用实体框架和LINQ的数据访问方法。 这些方法将GPS坐标传递给它们。数据库(和实体框架类型)上有经度和纬度字段,这些字段在创建行时填充。这一切都很好 我想做的是让我的LINQ查询拉回在给定GPS坐标附近(半径范围内)的行。我不想开始使用存储过程,因为这将是一个架构更改 有人对此有什么想法吗?我在苦苦思索。如果你想利用你的数据库空间索引(这将允许快速的空间查询),你应该将你的位置存储为表中

因此,据我所知,实体框架中还不支持地理SQL类型

我想知道是否有人能解决我的问题。我有一个c#类,它有一些使用实体框架和LINQ的数据访问方法。 这些方法将GPS坐标传递给它们。数据库(和实体框架类型)上有经度和纬度字段,这些字段在创建行时填充。这一切都很好

我想做的是让我的LINQ查询拉回在给定GPS坐标附近(半径范围内)的行。我不想开始使用存储过程,因为这将是一个架构更改


有人对此有什么想法吗?我在苦苦思索。

如果你想利用你的数据库空间索引(这将允许快速的空间查询),你应该将你的位置存储为表中的地理位置(如果你想访问这个值,你也可以保留当前的纬度/经度列)

由于Entity Framework目前不支持
Geography
类型/函数,恐怕您唯一的选择是编写一个内部调用
STDistance
(如果您使用SQL Server 2008 R2)的存储过程


老实说,由于空间函数实际上依赖于数据库(
STDistance
仅对SQL Server 2008 R2有效),因此为特定用例设置存储过程不是一个坏主意。

公认的答案已经过时。EF5引入了处理空间数据的API。下面是来自MSDN的一个示例

模型

DbContext

using System.Data.Entity;

public partial class UniversityContext : DbContext 
{ 
    public DbSet<University> Universities { get; set; } 
}
上面的查询结果应该是
离你最近的大学是:美术学院。


请参见

从EF5开始,添加了对DbGeography的支持。看看我的答案。
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); 
}