Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Haversine LINQ地理位置之间的距离_C#_Sql Server_Linq_Geolocation_Haversine - Fatal编程技术网

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);