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

问题描述 投票:0回答:1

我需要使用(经度,纬度)到达附近的位置

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

我想获取最近的位置,并且我有Sql代码,并希望将其转换为linq,在这里我正在使用ASP.Net MVC5这是我的代码:

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

但我收到此错误:

LINQ to Entities does not recognize the method 'Double Acos(Double)' 
method, and this method cannot be translated into a store expression.

我尝试使用“ public static double ToRadians”并传递该值,但是由于它是静态的,所以没有用

任何想法?

c# entity-framework
1个回答
0
投票
首先,您应该一键获取用户的位置数据:

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问题即可解决这些问题。
© www.soinside.com 2019 - 2024. All rights reserved.