Linq для лиц получить процедуру в новом заявлении - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь использовать что-то подобное в службе WCF:

У меня есть таблица с предложением с широтой и долготой. И Позиция от Пользователя. В запросе мне нужно расстояние от пользователя до предложения и порядок для этого.

private double Distanze(double LAT1, double LON1, double LAT2, double LON2)
{
    double e = (3.1415926538 * LAT1 / 180);
    double f = (3.1415926538 * LON1 / 180);
    double g = (3.1415926538 * LAT2 / 180);
    double h = (3.1415926538 * LON2 / 180);
    double i = (Math.Cos(e) * Math.Cos(g) *
        Math.Cos(f) * Math.Cos(h) + Math.Cos(e) *
        Math.Sin(f) * Math.Cos(g) * Math.Sin(h) +
        Math.Sin(e) * Math.Sin(g));
    double j = (Math.Acos(i));
    double k = (6371 * j);
    return k;
}

и в запросе:

public IQueryable<V1_Off_Offert> Get_myOffert()
{
    var User = GetCurrentPers_ID();

    if (User != 0)
    {
        double lat = GetCurrentPOS().LAT;
        double lon = GetCurrentPOS().LON;
        var query = from c in this.ObjectContext.C1_OFF_OFFERT
                    where c.C1_PERS_PERSON_ID == User
                    select new V1_Off_Offert()
                    {
                        ID = c.ID,

                        //......

                        LAT = (double)c.C1_ORT_GEO.LAT,
                        LON = (double)c.C1_ORT_GEO.LON,
                        //This it dosnt Work
                        Distanz = (double)Distanze((double)c.C1_ORT_GEO.LAT, (double)c.C1_ORT_GEO.LON, lat, lon),
                        Radius = (double)c.DISTANZ
                    };

        return query;
    }
    else return null;
}

Есть ли способ реализовать это?

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

Я попробую это:

public IQueryable<V1_Off_Offert> Get_myOffert()
    {

        var User = GetCurrentPers_ID();
        if (User != 0)
        {
            double lat = GetCurrentPOS().LAT;
            double lon = GetCurrentPOS().LON;
            var query = from c in this.ObjectContext.C1_OFF_OFFERT
                        where c.C1_PERS_PERSON_ID == User
                        select new V1_Off_Offert()
                        {
                            ID = c.ID,
                            Image = c.Image,
                            Start_Datum = c.VON,
                            End_Datum = c.BIS,
                            Name = c.C1_KEY_WORT.WORT,
                            Text = c.TEXT,
                            Preis = (decimal)c.PREIS != 0 ? (decimal)c.PREIS : 0,
                            WORT = c.C1_GRUP_GRUPPE.C1_KEY_WORT.WORT,
                            PERS_ID = (int)c.C1_PERS_PERSON_ID,
                            //COM_ID = (int)c.C1_COM_COMP_ID,
                            EH_ID = c.C1_OFF_EINHEIT_ID,
                            LAT = (double)c.C1_ORT_GEO.LAT,
                            LON = (double)c.C1_ORT_GEO.LON,

                            //Distanz = (double)Distanze((double)c.C1_ORT_GEO.LAT, (double)c.C1_ORT_GEO.LON, lat, lon),
                            Radius = (double)c.DISTANZ

                            //LAT = c.C1_ORT_GEO.LAT != null ? (double)c.C1_ORT_GEO.LAT : 0
                        };
            foreach (V1_Off_Offert T in query)
            {
                T.Distanz = Distanze(T.LAT, T.LON, lat, lon);                    
            }



        return query;

            }
        else return null;
    }

это работает:

foreach (V1_Off_Offert T in query)
            {
                T.Distanz = Distanze(T.LAT, T.LON, lat, lon);                    
            }

Есть ли способ использовать первый способ, может быть, как лямбда-выражениено не так уж и элегантно поставить Результат запроса в запросе !!!

0 голосов
/ 19 марта 2012

Хорошо, я вижу, в чем проблема. LINQ to SQL пытается перевести Distanze в SQL. Не может, поэтому умирает. Вы должны выполнить проекцию после того, как вы уже выполнили запрос к базе данных.

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