基于经纬度(lat、lng)对EF Core查询结果按距离排序
根据指定经纬度对数据表按距离排序
需求:我有一张包含lat和lng列的数据表,希望根据指定位置的经纬度对表中数据进行排序,让距离最近的位置排在最前,其余数据按相同规则排序。
实现代码
首先是核心排序逻辑:
IQueryable<Post> result = result.OrderBy(x => Haversine(x.BeginningLat ?? 0, lat ?? 0, x.BeginningLng ?? 0, lng ?? 0));
然后是用于计算球面两点距离的Haversine方法:
private static double Haversine(double lat1, double lat2, double lon1, double lon2) { const double r = 6378100; // 地球半径,单位:米 var sdlat = Math.Sin((lat2 - lat1) / 2); var sdlon = Math.Sin((lon2 - lon1) / 2); var q = sdlat * sdlat + Math.Cos(lat1) * Math.Cos(lat2) * sdlon * sdlon; var d = 2 * r * Math.Asin(Math.Sqrt(q)); return d; }
关键说明
Haversine方法基于哈弗辛公式计算球面两点间的直线距离,结果以米为单位,适合地理位置的距离计算场景。- 代码中用
?? 0处理了经纬度字段可能为null的情况,避免空引用异常。 - 通过
OrderBy按计算出的距离升序排列,直接实现了距离最近的数据排在最前面的需求。
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

