#c# #sql-server #linq #tsql #entity-framework-core
#c# #sql-сервер #linq #tsql #сущность-фреймворк-ядро
Вопрос:
Существует таблица, которая содержит float [Lat1], [Lon1], [Lat2], [Lon2]
. Они представляют координаты точек на карте. Мне нужно выбирать только те записи, где расстояние между этими точками больше некоторого значения. Мне также нужно получить само расстояние, а не только координаты. Итак, в SQL я могу использовать следующую функцию:
Distance = GEOGRAPHY::Point([Lat1], [Lon1], 4326).STDistance(GEOGRAPHY::Point([Lat2], [Lon2], 4326))
Как мне добиться того же результата с помощью Entity Framework Core? Я знаю, что могу использовать .FromSqlRaw("...")
для фильтрации записей. Но, похоже, нет способа вернуть вычисленное расстояние.
Комментарии:
1. Используйте хранимую процедуру SQL.
2. Использование хранимых процедур, подобных
.FromSqlRaw("stored_procedure ...")
, ничем не отличается от непосредственного написания кода sql.FromSqlRaw("select ...")
.3. Почему вы не получаете результатов? Попробуйте выполнить запрос в SQL Server Management Studio и посмотрите, получите ли вы результаты. SSM выдает лучшие сообщения об ошибках, чем в c #. Если вы получаете результаты в SSMS, то я подозреваю, что вам нужно указать полный путь к тому, где функции расположены на сервере SQL. Возможно, вам не хватает системной базы данных, содержащей эти методы.
4. Извините, позвольте мне немного уточнить. Я получаю отличные результаты. Однако в моей модели entity framework нет переменной «Расстояние», только «Широта» и «Длина». Итак, даже если я напишу что-то вроде
.FromSqlRaw("select *, Distance = ... ")
, я не получу значение расстояния, потому что в моей модели его нет.5. Вам нужно добавить расстояние до модели или просто получить значения? При получении списка значений из запроса мне никогда не имеет смысла возвращать одно значение. Откуда вы знаете, какое расстояние проходит с какими точками. SQL Server является многопоточным, поэтому, выполняя один и тот же запрос несколько раз, вы получите результаты в другом порядке. Поэтому я всегда рекомендую выполнять Order By в запросах. В вашем случае порядок по еще больше перепутает расстояние и точки.