GPS 与实体框架和 LINQ 协调

问题描述 投票:0回答:2

所以据我所知,实体框架还不支持 Geography SQL 类型。

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

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

有人对此有任何想法吗?我正在为想法而苦苦挣扎。

c# .net linq entity-framework gps
2个回答
9
投票

接受的答案已过时。 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; } 
}

数据库上下文

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.

在此处查看整篇文章和视频。


2
投票

如果你想利用你的数据库空间索引(这将允许快速空间查询),你应该将你的位置存储为

Geography
在你的表中(如果你想访问,你也可以保留当前的纬度/经度列这个值)。

由于 Entity Framework 目前不支持

Geography
类型/函数,恐怕您唯一的选择是编写一个内部调用
STDistance
的存储过程(如果您使用 SQL Server 2008 R2)。

老实说,由于空间函数实际上取决于数据库(

STDistance
仅对 SQL Server 2008 R2 有效),为您的特定用例存储过程并不是一个坏主意。

© www.soinside.com 2019 - 2024. All rights reserved.