GPS координаты с Entity Framework и LINQ - PullRequest
3 голосов
/ 12 марта 2012

Итак, из того, что я прочитал, тип Geography SQL еще не поддерживается в рамках сущностей.

Мне было интересно, есть ли у кого-нибудь решение моей проблемы. У меня есть класс C #, который имеет несколько методов доступа к данным, используя структуру сущностей и LINQ. Эти методы передают координаты GPS в них. База данных (и типы структур сущностей) имеют поля долготы и широты, которые заполняются при создании строк. Это все отлично работает.

Я хочу, чтобы мои запросы LINQ отбрасывали строки, которые находятся (в радиусе) от заданных координат GPS. Я не хочу начинать использовать хранимые процедуры, так как это будет изменение архитектуры.

У кого-нибудь есть идеи по этому поводу? Я борюсь за идеи.

Ответы [ 2 ]

5 голосов
/ 24 июля 2016

Принятый ответ устарел. 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.

См. всю статью и видео здесь.

1 голос
/ 12 марта 2012

Если вы хотите воспользоваться пространственным индексом вашей базы данных (который позволит выполнять быстрые пространственные запросы), вы должны сохранить свои позиции как Geography в своей таблице (вы также можете сохранить текущие столбцы широты / долготы, если хотите доступ к этим значениям).

Поскольку Entity Framework пока не поддерживает Geography типы / функции, я боюсь, что ваш единственный вариант - написать хранимую процедуру, которая внутренне вызывает STDistance (если вы используете SQL Server 2008 R2).

Честно говоря, поскольку пространственные функции фактически зависят от базы данных (STDistance действительно только для SQL Server 2008 R2), неплохо было бы иметь хранимую процедуру для вашего конкретного варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...