2012-05-10 6 views
0

좋아, 여기 내 문제가있다. 데이터베이스 테이블 BloodCenters, latitudelongitude 필드가 있습니다. Linq Lambda Syntax를 사용하여 주어진 포인트를 기준으로 주어진 반경 내에있는 BloodCenters를 검색하여 해당 테이블을 쿼리하려고합니다.람다에서 사용자 정의 함수를 호출하는 방법 .NET 구문

은이 코드를 사용하고 있지만, 여전히합니다 (어디 조건 내에서) 나에게 오류를 제공합니다 :

public static List<BloodCenter> GetAllNearby(int latitude, int longitude, int radius, int limit){ 
    List<BloodCenter> res = null; 
    res = new DBEntities().BloodCenters.Where(b => 
     Util.distance(latitude, longitude, b.Latitude, b.Longitude, "K") <= radius).Take(limit); 
    return res; 
} 

Util.distance는 위도와 경도의 두 점 사이의 거리를 반환하는 기능입니다. 편집 됨 따라서 내 자신의 함수를 Where 술어 안에 넣을 수 없습니다. 하지만 SQL 구문을 사용하여 거리를 계산할 수 있습니까? 여기 내 Util.Distance 구현의 : Util.distance이 C# 코드로 구현하고 쿼리 표면이는 SQL로 번역 될 얼마나 아무 생각이 없기 때문에 작동하지 않습니다

public static double distance(double lat1, double longi1, double lat2, double longi2, string unit){ 
    var theta = longi1 - longi2; 
    var dist = Math.Sin(DegreeToRadian(lat1)) * Math.Sin(DegreeToRadian(lat2)) + 
     Math.Cos(DegreeToRadian(lat1)) * Math.Cos(DegreeToRadian(lat2)) * Math.Cos(DegreeToRadian(theta)); 
    dist = Math.Acos(dist); 
    dist = RadianToDegree(dist); 
    var miles = dist * 60 * 1.1515; 
    unit = unit.ToUpper(); 
    if (unit.Equals("K")) 
     return miles * 1.609344; 
    else if (unit.Equals("N")) 
     return miles * 0.8684; 
    else 
     return miles; 
} 
+1

위도와 경도를 구현하는 것입니다? –

+0

일부 관리 코드 대신 SQL Server 공간 데이터 형식을 사용해야 함 function –

답변

1

(또는 그 가능할 것이다 경우). 물론

res = new DBEntities().BloodCenters.ToList() 
      .Where(b => Util.distance(latitude, longitude, b.Latitude, b.Longitude, "K") <= radius) 
      .Take(limit); 
return res; 

좋은 생각이 하나,하지만 때로는 단순히 거기되지 않은 모든 레코드를 가져 오는 :

즉각적인 해결 방법은 다음과 같이 데이터베이스에서 모든 레코드를 가져 오기 및 인스턴스에 술어를 적용하는 것입니다 다른 방법은 없습니다.

시도해 볼 수있는 것은 Where 술어 안에 Util.distance의 논리를 인라인하는 것입니다. 논리가 "단순한"연산 (기본 연산과 같은)만을 사용하여 표현 될 수 있다면 쿼리 표면은이를 SQL로 변환 할 수 있고 모든 것이 원활하게 진행될 것입니다.

Here은 자동으로 SQL로 변환 할 수있는 모든 메소드 목록입니다.

+0

설명해 주셔서 감사합니다. 불행히도 귀하의 링크에 삼각 함수가 표시되지 않았습니다. 나는 Util.Distance 구현의 세부 사항을 제공함으로써 나의 질문을 편집했다. –

0

DBEntities().BloodCentersIEnumerable 또는 List 또는 로컬에 저장된 다른 것으로 변환해야합니다. Linq to SQL은 C#을 SQL로 변환하므로 SQL 서버가 제공하는 기능 만 사용할 수 있습니다.

대안은 번역 문장과 기능을 시뮬레이션하거나 데이터베이스에서`int` 년대로 (저장 프로 시저 또는 같은)

관련 문제