Расчетное свойство с использованием параметра в RIA Services - PullRequest
0 голосов
/ 14 марта 2012

Я выполняю расчеты расстояния между адресами. В частности, расстояние между пользователем и конкретным местоположением. Я могу создавать запросы LINQ, которые заставляют базу данных вычислять расстояние и упорядочивать результаты по этому расстоянию. Однако я не могу найти способ ВОЗВРАТИТЬ это расстояние в сущностях. Упрощенная версия запроса приведена ниже:

    public IQueryable<Place> GetPlacesWithinRadiusOfUser(double userLongitude, double userLatitude, int miles )
    {

        return (from Place in this.ObjectContext.Places
                where RadiusOfEarth * Math.Acos((double)
                    (Math.Sin((double)Place.Addresses.First().Latitude / DegreesToRadians) * Math.Sin(userLatitude / DegreesToRadians))
                    +
                    (Math.Cos((double)Place.Addresses.First().Latitude / DegreesToRadians) * Math.Cos(userLatitude / DegreesToRadians)
                    * Math.Cos((userLongitude / DegreesToRadians) - ((double)Place.Addresses.First().Longitude / DegreesToRadians))
                    )
                    )
                    <= miles
                select Place);


    }

По сути, математика сверху, которую мне нужно вернуть как свойство Distance для Address Entity (который является дочерним по отношению к Place). Я создал следующий частичный класс, и поле появляется в клиенте silverlight.

public partial class Address
{
    //The Distance field is used to return a distance if a reference point is provided in a query
    [DataMember]
    public Nullable<decimal> Distance { get; set; }

}

Итак, свойство Distance и расчеты зависят от параметров метода GetPlacesWithinRadiusOfUser .

Есть ли способ получить параметры из запроса к Адресной сущности , чтобы я мог выполнить те же вычисления и сделать их доступными в сущности по прибытии к клиенту?

Я, конечно, могу создать подпрограмму на стороне клиента, которая будет выполнять эти вычисления, но это будет запутанным, поскольку мне придется постоянно вводить это в каждый пользовательский интерфейс, который в этом нуждается. Я бы предпочел вернуть его в Entity, чтобы я мог просто привязать его и отобразить его (по сути, я хочу, чтобы вычисляемое поле возвращалось из SQL). Если бы это был строгий SQL, это было бы тривиально, но я не знаю, как это сделать с помощью RIA Services и Entity Framework.

а мысли?

1 Ответ

0 голосов
/ 13 апреля 2012

С Entity Framework я так и не смог найти способ сделать это (так, как я хотел).Однако я нашел довольно хорошее решение.Шаги следующие:

  1. Создайте запрос, выполнив вычисление расстояния для ObjectContext .... затем отфильтруйте запрос Place по возвращаемым значениям.Все это делается за один запрос от клиента.Он не возвращает расстояние ... но я справился с этим по-другому.

  2. Затем я создал методы расширения для всех соответствующих объектов следующим образом:

    public static class AddressExtensions
    {
    
    
    public static double CalculateDistanceTo(this Address address1, double longitude, double latitude)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return Global.CalculateDistance((double?)address1.Longitude, (double?)address1.Latitude, longitude, latitude);
    
    }
    
    public static double CalculateDistanceTo(this Address address1, Address address)
    {
        if (address1 == null || address == null)
        {
            return 0;
        }
    
        return Global.CalculateDistance((double?)address1.Longitude, (double?)address1.Latitude, (double?)address.Longitude, (double?)address.Latitude);
    
    }
    
    public static double CalculateDistanceTo(this Address address1, User user)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return address1.CalculateDistanceTo(user.Addresses.FirstOrDefault());
    
    }
    
    public static double CalculateDistanceTo(this Address address1, Place place)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return address1.CalculateDistanceTo(place.Addresses.FirstOrDefault());
    
    }
    }
    
  3. Затем, где бы мне ни понадобилось получить расстояние, я мог сделать что-то вроде User.DistanceTo (myAddress)

Это на самом деле получилось немного лучше, потому чтоЗатем я мог бы использовать те же самые методы расширения независимо от ситуации.

...