如何使用LINQ获取范围内的记录列表

时间:2014-03-14 11:03:04

标签: c# linq

我正在尝试在我的页面上集成Google Map,但在我集成之前,我需要从数据库中提取数据,我需要提取一个地方的lat和lon然后我想要提取那些地方也在提取的地方lat / lon附近。

我有一个需要mofiication的查询

public static List<PlaceMap> GetPlace(this IEnumerable<Place> places, string hotelName, ref DataEntities ctx)
{             
   var place= ctx.places
       .Where(h=>h.HotelName==hotelName)
       .Select(s => new PlaceMap
       {
           PlaceName= s.PlaceName,
           Latitude = s.Latitude,
           Longitude = s.Longitude,
           NearByPlaces = ????

        }).SingleOrDefault();
    return place;
}

2 个答案:

答案 0 :(得分:2)

查看实体框架的DBGeography:

public static List<PlaceMap> GetPlace(this IEnumerable<Place> places, string hotelName, ref DataEntities ctx)
{
    var place= ctx.places
        .Where(h=>h.HotelName==hotelName)
        .Select(s => new PlaceMap
        {
            PlaceName= s.PlaceName,
            Latitude = s.Latitude,
            Longitude = s.Longitude,
            NearByPlaces = ctx.places.Where
            (
                x=>
                DbGeography.FromText("POINT(" + s.Longitude + " " + s.Latitude + ")")  
                .Distance
                (
                    DbGeography.FromText("POINT(" + x.Longitude + " " + x.Latitude + ")")
                ) < YourRadiousInMeters
            )                  
        }).SingleOrDefault();
    return place;
}

答案 1 :(得分:0)

NearByPlaces = (from p in ctx.places
                where p.Latitude > s.Latitude - latrange && 
                      p.Latitude < s.Latitude + latrange &&
                      p.Longitude > s.Longitude - longrange && 
                      p.Longitude < S.Longitude + longrange
                select /* whatever */).ToArray()

话虽这么说,如果你有很多地方(例如数百万)并且你的数据库上没有空间索引,那么这样的查询可能效率很低。显然,为了获得空间索引,您需要使用空间类型来存储位置,而不是单独的纬度和经度列。在SQL Server中,您将使用SqlGeography列。可以将实体框架作为DbGeography进行查询。

这应该回答您的实际问题,但它当然不会解决您的方法的其他问题,请参阅其他人发布到您的问题的评论。