2012-03-19 1 views
-1

의 절차를 얻을 :Linq에에 실체 내가 WCF 서비스에서 같은 것을 사용하려고 새로운 statemant

나는 위도 및 경도와 제안이있는 테이블이있다. 그리고 사용자로부터의 위치. 쿼리에서 나는 사용자로부터 오퍼까지의 거리가 필요하고 이것을 주문합니다.

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; 
} 

이것을 실현하는 방법이 있나요 :

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; 
} 

및 쿼리에

?

+1

질문에 철자를 수정하십시오. 그것은 당신을 도우려는 사람에게 모욕입니다. –

+0

전체 ** 예외 메시지를 게시 할 수 있습니까 ?? 당신은 단지 우리에게 작은 발췌 문장을주고 있습니다. 가장 중요한 부분은 빠져 있습니다 ... –

+0

'Math.Pi'를 사용하는 것이 좋을지도 모르며,'(3.1415926538 * x/180 ConvertToRadians (x);'6371이 무엇인지 전혀 모르겠지만 컨텍스트를 제공하면 미래의 자기가 감사 할 것입니다. (주석은 한 가지 방법이지만 주석은 단지 사과입니다. //butunclebob.com/ArticleS.TimOttinger.ApologizeIncode)). – jason

답변

0

그래, 문제가 무엇인지 알 겠어. LINQ to SQL에서 Distanze을 SQL로 변환하려고합니다. 그것은 할 수 없으므로 죽습니다. 이미 데이터베이스에서 쿼리를 실행 한 후에 프로젝션을 수행해야합니다.

+0

좋아, 이제. 하지만 이것을 LinQ에서도 사용할 수 있어야합니다. – user1063423

+0

이상한 요구 사항입니다. 이유를 말해줘. – jason

0

나는이 시도 :

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);      
      } 

이는 람다 식으로 아마 첫 번째 방법 를 사용하는 방법입니다. 하지만 foreach의 결과를 쿼리에 넣는 것이 너무 우아하지 않습니다 !!!