加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 使用LINQ从数据库中查找附近的地方

发布时间:2020-12-16 07:05:39 所属栏目:asp.Net 来源:网络整理
导读:我们希望在ASP.NET 2012中使用LINQ从数据库接收附近地点的列表,并希望对我们的策略有一些反馈. 我的表和假数据: PlaceId Name Latitude Longitude 1 A 18.1 20.1 2 B 18.2 20.2 3 C 18.3 20.3 1)在我们的项目中,客户端当前位置(纬度和经度)被视为输入 2)在
我们希望在ASP.NET 2012中使用LINQ从数据库接收附近地点的列表,并希望对我们的策略有一些反馈.

我的表和假数据:

PlaceId    Name       Latitude   Longitude 
       1          A          18.1        20.1
       2          B          18.2        20.2
       3          C          18.3        20.3

1)在我们的项目中,客户端当前位置(纬度和经度)被视为输入

2)在服务器端,根据客户端的当前位置,我们需要使用LINQ从数据库中查找附近的位置

这是我之前使用的SQL代码,但现在我们想使用LINQ.

SELECT  name,Latitude,Longitude,( 3959 * acos( cos( radians(?) )* cos( radians( Latitude) ) * cos( radians( Longitude ) - radians(?) ) 
 + sin( radians(?) ) * sin( radians( Latitude) ) ) ) AS distance 
FROM TABLE_NAME 
HAVING distance < ? 
ORDER BY distance LIMIT 0,20

[但问题是如何在LINQ中编写这样的查询.]

我的工作:

在搜索解决方案时,我遇到了这段代码

var Value1 = 57.2957795130823D;
        var Value2 = 3958.75586574D;

        var searchWithin = 20;

    double latitude = ConversionHelper.SafeConvertToDoubleCultureInd(Latitude,0),longitude = ConversionHelper.SafeConvertToDoubleCultureInd(Longitude,0);

    var location = (from l in sdbml.Places
                    let temp = Math.Sin(Convert.ToDouble(l.Latitude) / Value1) *  Math.Sin(Convert.ToDouble(latitude) / Value1) +
                             Math.Cos(Convert.ToDouble(l.Latitude) / Value1) *
                             Math.Cos(Convert.ToDouble(latitude) / Value1) *
                             Math.Cos((Convert.ToDouble(longitude) / Value1) - (Convert.ToDouble(l.Longitude) / Value1))
                         let calMiles = (Value2 * Math.Acos(temp > 1 ? 1 : (temp < -1 ? -1 : temp)))
                         where (l.Latitude > 0 && l.Longitude > 0)
                         orderby calMiles
                        select new location
                             {
                                    Name = l.name
                                });
                        return location .ToList();

但问题是,如何引用ConversionHelper或它来自哪个命名空间.

所有建议表示赞赏.

解决方法

所以,如果您想要的只是计算两个坐标之间的距离,为什么不使用Dot Net的GeoCoordinate?

它就像是

var firstCordinate = new GeoCoordinate(latitude1,longitude1);
 var secondCordinate = new GeoCoordinate(latitude2,longitude2);

 double distance = firstCordinate.GetDistanceTo(secondCordinate);

你可以在命名空间System.Device.Location中找到它.

因此,这将使您免于所有Math.Cos和Math.Sin,您的linq将简单明了. (可能是一个foreach循环会做)

所以你的整个查询可以概括为:

List<Location> locations = new List<Location>();
foreach(var place in sdbml.Places)
{
   //your logic to compare various place's co-ordinates with that of
   //user's current co-ordinate
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读