GPS与实体框架和LINQ协调

时间:2012-03-12 10:32:39

标签: c# .net linq entity-framework gps

因此,根据我的描述,实体框架中尚不支持Geography SQL类型。

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

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

有没有人对此有任何想法?我正在努力争取创意。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

如果您想利用数据库空间索引(允许快速空间查询),您应该将您的位置存储在表格中Geography(如果您还可以保留当前的纬度/经度列想要访问这个值。)

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

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