Using LINQ find nearby places from database

.net, asp.net, c#-4.0, linq, sql-to-linq-conversion

Solution

Here is the code which finally I have to settle down with

1)Create a class , say

DistanceModel.cs

public class DistanceModel
{
   public int PlaceId { get; set; }

   public string Name { get; set; }

   public double Latitute { get; set; }

   public double Longitude { get; set; }

} 

2)Then include the below code in whichever file you want to , say

MainPage.cs

     /*Call GetAllNearestFamousPlaces() method to get list of nearby places depending 
      upon user current location.
      Note: GetAllNearestFamousPlaces() method takes 2 parameters as input
     that is GetAllNearestFamousPlaces(user_current_Latitude,user_current_Longitude) */


   public void GetAllNearestFamousPlaces(double currentLatitude,double currentLongitude)
    {
        List<DistanceModel> Caldistance = new List<DistanceModel>();
        var query = (from c in sdbml.Places
                     select c).ToList();
        foreach (var place in query)
        {
            double distance = Distance(currentLatitude, currentLongitude, place.Latitude, place.Logitude);
            if (distance < 25)          //nearbyplaces which are within 25 kms 
            {
                DistanceModel dist = new DistanceModel();
                dist.Name = place.PlaceName;
                dist.Latitute = place.Latitude;
                dist.Longitude = place.Logitude;
                dist.PlaceId = place.PlaceId;
                Caldistance.Add(getDiff);
            }
        }                      
    }

   private double Distance(double lat1, double lon1, double lat2, double lon2)
    {
        double theta = lon1 - lon2;
        double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
        dist = Math.Acos(dist);
        dist = rad2deg(dist);
        dist = (dist * 60 * 1.1515) / 0.6213711922;          //miles to kms
        return (dist);
    }

   private double deg2rad(double deg)
    {
        return (deg * Math.PI / 180.0);
    }

   private double rad2deg(double rad)
    {
        return (rad * 180.0 / Math.PI);
    }

It worked for me, Hope it will help you to .

Problem

We want to receive list of nearby places from database using LINQ in ASP.NET 2012 and would like some feedback on our strategy. My table and fake data: ``` PlaceId Name Latitude Longitude 1 A 18.1 20.1 2 B 18.2 20.2 3 C 18.3 20.3 ``` 1) In our project the client current location (latitude and longitude) is taken as input 2) At server side ,depending upon the client current location, we need to find nearby places from the database using LINQ Here's the code for SQL which I earlier used , but now we want to use 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 ``` [But the question is how to write such an query in LINQ.] My work on this: While searching for the solution, I came across this code ``` 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(); ``` But the problem is ,how to reference ConversionHelper or under which namespace it comes. All advice is appreciated.

Original source