C# Haversine LINQ地理位置之间的距离
我有这个工作代码:C# Haversine LINQ地理位置之间的距离,c#,sql-server,linq,geolocation,haversine,C#,Sql Server,Linq,Geolocation,Haversine,我有这个工作代码: IEnumerable<Message> dbCities = db.Cities; dbCities = dbCities.Where(x => GetDistanceBetweenLocations(longitude, latitude, x.Longitude, x.Latitude) <= radius); public int GetDistanceBetweenLocations(double lon1, double lat1, d
IEnumerable<Message> dbCities = db.Cities;
dbCities = dbCities.Where(x => GetDistanceBetweenLocations(longitude, latitude, x.Longitude, x.Latitude) <= radius);
public int GetDistanceBetweenLocations(double lon1, double lat1, double lon2, double lat2)
{
var sCoord = new GeoCoordinate(lon1, lat1);
var eCoord = new GeoCoordinate(lon2, lat2);
return Convert.ToInt32(Math.Round(sCoord.GetDistanceTo(eCoord)));
}
IEnumerable dbCities=db.Cities;
dbCities=dbCities.Where(x=>GetDistanceBetweenLocations(经度,纬度,x.经度,x.纬度)错误消息不言自明:EF的LINQ提供程序不知道如何将名为GetDistanceTo的函数映射到它的SQL对应函数
如果希望底层DBMS完成任务,则需要重写查询以仅使用。或者,您可以将逻辑定义为数据库中的UDF(如果数据库引擎支持UDF)和
但是,如果要在应用程序中处理此问题,可以将LINQ to Entites查询“强制”到LINQ to Objects one中:
dbCities = db.Cities.AsEnumerable().Where(x => new GeoCoordinate(longitude, latitude).GetDistanceTo(new GeoCoordinate(x.Longitude, x.Latitude)) <= radius);
dbCities=db.Cities.aseneumerable().Where(x=>new geocordination(longitude,latitude).GetDistanceTo(new geocordination(x.longitude,x.latitude))我知道这一点……但正如我所说,我需要在db(IQueryable)中执行逻辑。这与我最初的代码没有什么不同,它无法解决性能问题。“我需要在DB中执行逻辑(IQueryable)"。我的回答包括:您需要使用规范函数或UDF来实现逻辑。如果您想让DB来完成这项工作,则没有其他方法。用于查找坐标之间地理距离的规范函数和UDF很难使用实体框架来实现和管理,但您的更新帮助我实现了这一点.谢谢.另一个问题可能对你有帮助。
dbCities = db.Cities.AsEnumerable().Where(x => new GeoCoordinate(longitude, latitude).GetDistanceTo(new GeoCoordinate(x.Longitude, x.Latitude)) <= radius);