Проблема с Linq-to-SQL запросом - PullRequest
1 голос
/ 13 октября 2011

У меня есть следующий запрос в SQL:

SELECT TOP 25 *, SQRT(POWER(Latitude - 51.4644, 2) + POWER(Longitude - 0.0988, 2)) * 62.1371192 AS DistanceFromAddress
FROM [Stops].[dbo].[Stops_edited_small]
WHERE ABS(Latitude - 51.4644) < 0.09 AND ABS(Longitude - 0.0988) < 0.09
ORDER BY DistanceFromAddress 

Мне нужно преобразовать его в Linq-to-SQL

Я до сих пор получил это:

 public List<Stops_edited_small> GetMembers(double curLatitude, double curLongitude, int number)
    {
     using (DataClasses1DataContext db = new DataClasses1DataContext())
        {
             int DistanceFromAddress;
            var members = (from member in db.Stops_edited_smalls
                          where Math.Sqrt(Math.Pow(Convert.ToDouble(member.Latitude) - curLatitude, 2) + Math.Pow(Convert.ToDouble(member.Longitude) - curLongitude, 2)) * 62.1371192 as DistanceFromAddress
                          where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05
                          && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05
                          select member).Take(25);

            return members.ToList();
        }
}

Я потерял, что делать с частью as DistanceFromAddress и как правильно интегрировать ее в мой c #?Я думаю, у меня есть слишком много, где предложения, а также.Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: включил целый класс, чтобы показать тип возврата (это служба WCF)

Ответы [ 3 ]

1 голос
/ 13 октября 2011

Как то так?

        var members = (from member in db.Stops_edited_smalls
                       where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05
                       && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05
                       select new { member, DistanceFromAddress = Math.Sqrt(Math.Pow(Convert.ToDouble(member.Latitude) - curLatitude, 2) + Math.Pow(Convert.ToDouble(member.Longitude) - curLongitude, 2)) * 62.1371192 }).Take(25);
1 голос
/ 13 октября 2011

Мне не нравится эта формула расчета расстояния, но я построил набор классов, которые можно использовать для вычисления расстояния по формуле Хаверсайна. Надеемся, что это будет немного проще реализовать в вашем запросе LINQ, поскольку все это объединено в два класса.

Класс GeocodedPosition:

public class GeocodedPosition
{
    private double lat;
    private double lon;

    public GeocodedPosition(double latitude, double longitude)
    {
        lat = latitude;
        lon = longitude;
    }

    public double Latitude
    {
        get
        {
            return lat;
        }
    }

    public double Longitude
    {
        get
        {
            return lon;
        }
    }
}

Класс GeocodeCalculator:

public class GeocodeCalculator
{
    private const int earthRadiusMiles = 3960;
    private const int earthRadiusKilometers = 6371;

    public enum DistanceType
    {
        Miles,
        Kilometers
    }

    /// <summary>
    /// Uses the Haversine formula to calculate the distance between two locations
    /// </summary>
    /// <param name="pos1"></param>
    /// <param name="pos2"></param>
    /// <param name="type"></param> 
    /// <returns></returns>
    public double Distance(GeocodedPosition PositionA, GeocodedPosition PositionB, DistanceType type)
    {
        double r = (type.Equals(DistanceType.Miles)) ? earthRadiusMiles : earthRadiusKilometers;
        double dLat = ToRadian(PositionB.Latitude - PositionA.Latitude);
        double dLon = ToRadian(PositionB.Longitude - PositionA.Longitude);
        double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(ToRadian(PositionA.Latitude)) * Math.Cos(ToRadian(PositionB.Latitude)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
        double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
        double d = r * c;
        return d;
    }

    /// <summary>
    /// Convert to Radians
    /// </summary>
    /// <param name=”val”></param>
    /// <returns></returns>
    private double ToRadian(double val)
    {
        return (Math.PI / 180) * val;
    }
}
0 голосов
/ 14 октября 2011

Решение было настолько простым, что я даже не учел его!

 var members = (from member in db.Stops_edited_smalls

                          where Math.Abs(Convert.ToDouble(member.Latitude) - curLatitude) < 0.05
                          && Math.Abs(Convert.ToDouble(member.Longitude) - curLongitude) < 0.05
                          orderby (Math.Sqrt(Math.Pow(Convert.ToDouble(member.Latitude) - curLatitude, 2) + Math.Pow(Convert.ToDouble(member.Longitude) - curLongitude, 2)) * 62.1371192)
                          select member).Take(number);

            members.ToList();

Просто добавил строку заказа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...