C# 通过数据库中的linq使用经度和纬度查找最近的位置

C# 通过数据库中的linq使用经度和纬度查找最近的位置,c#,entity-framework,C#,Entity Framework,我需要使用(经度、纬度)获取附近的位置 我有一个表,其中位置保存在数据库中,带有经度和纬度字段 我想检索最近的位置,我有Sql代码,并想将其转换为linq,在这里我使用ASP.NETMVC5 这是我的密码: SELECT Name, ( 3959 * acos( cos( radians(24.743055) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(46.669702) ) + sin( rad

我需要使用(经度、纬度)获取附近的位置

我有一个表,其中位置保存在数据库中,带有经度和纬度字段

我想检索最近的位置,我有Sql代码,并想将其转换为linq,在这里我使用ASP.NETMVC5 这是我的密码:

SELECT Name, ( 3959 * acos( cos( radians(24.743055) ) * cos( radians( 
latitude ) ) * 
cos( radians( longitude ) - radians(46.669702) ) + sin( radians(24.743055)  
)* 
sin( radians( latitude ) ) ) ) AS distance 
FROM Event
ORDER BY distance
我用linq写的是这样的:

double startlat = Convert.ToDouble(db.Users.Where(u => u.Id == 2).Select(u 
=> u.latitude).Single());


double startlng = Convert.ToDouble(db.Users.Where(u => u.Id == 2).Select(u 
=> u.longitude).Single());


var c = (from ev in db.Event
where (3959 * Math.Acos(Math.Cos((Math.PI * startlat / 180.0)) * 
Math.Cos(Math.PI * (Convert.ToDouble(ev.latitude)) / 180.0) *
Math.Cos((Math.PI * (Convert.ToDouble(ev.longitude)) / 180.0) - (Math.PI * 
(startlng) / 180.0)) + Math.Sin(Math.PI * (startlat) / 180.0)) *
Math.Sin(Math.PI * (Convert.ToDouble(ev.latitude) ) / 180.0) ) < 2500
select ev.Name).ToList();
我尝试使用“公共静态双toradian”并传递值,但由于它是静态的,所以无效


有什么想法吗?

首先,您应该一次点击即可获得用户的位置数据:

var startCoords = db.Users.Where(u => u.Id == 2).Select(u 
=> new { u.latitude, u.longitude }).Single();
为了得到最近的位置,是否可以将其简化为X增量和Y增量之和,并取最小的总增量

var closestEvent = db.Event.Select(x => new { x.EventId, delta = Math.Abs(x.latitude - startCoords.latitude) + Math.Abs(x.longitude - startCoords.longitude)})
.OrderBy(x => x.delta)
.FirstOrDefault();
这可能过于简化,但给定X,Y坐标,比较绝对差之和会给你一个粗略的排名。如果需要更详细的公式,或者您想将这些公式输入到Google Earth之类的东西中进行道路检查或其他寻路,粗略检查可以将前10个左右的事件和坐标返回到内存中,在内存中可以对这些事件和坐标运行更详细的检查,而不必担心转换为SQL问题。

显然您已经阅读了(可能在同一条错误消息上有类似的帖子)……你能澄清一下为什么这条路线不适合你吗?
var closestEvent = db.Event.Select(x => new { x.EventId, delta = Math.Abs(x.latitude - startCoords.latitude) + Math.Abs(x.longitude - startCoords.longitude)})
.OrderBy(x => x.delta)
.FirstOrDefault();