2011-01-01 3 views
1

함수에 수식을 작성하고이를 내 EF 쿼리에 전달합니다. 작동하지 않습니다. 그러나 Math.Pow (x, x)와 같은 함수가 작동합니다. 왜? 내 수식을 내 쿼리에 직접 통합해야합니까?엔티티 프레임 워크에 수학 공식 전달하기

var i = from u in Locations 
    where (SquareRoot(u.SomeField) < radius) 
    select u; 

    public double SquareRoot(double val) 
    { 
    return Math.Pow(val, 0.5); 
    } 

그러나이 작품 :

var i = from u in Locations 
    where (Math.Pow(u.SomeField, 0.5) < radius) 
    select u; 

나는 간단한 사각형보다 훨씬 더 큰 것 사용하려면 실제 공식. 지구상의 점들 사이의 거리와 같은 수식 등.이 때문에 저는 수식을 쿼리에서 분리하여 함수로 사용하고 싶습니다.

public double DistanceBetweenPoints(double centerLat, double centerLon, double pointLat, double pointLon) 
{ 
    const double sphericalValue = 69.1; 
    return Math.Sqrt((Math.Pow(sphericalValue*(pointLat-centerLat), 2)) + (Math.Pow(sphericalValue*(pointLon-centerLon)*Math.Cos(centerLat/57.3), 2))); 
} 

Math.Sqrt을()과와 Math.cos EF는 지원되지 않습니다

실제 화학식은 다음과 같다.

+0

여기서 도와 주실 수 있습니까? 'Math.Pow (u.Latitude, 0.5)'는 실제로 의미가 있습니까? – jason

+0

나는 수식을 단순화했다. 그러나 내가 만난 문제는'Math.Sqrt'가 지원되지 않는다는 것이다. SquareRoot와 동일합니다. –

+0

저는 위도의 제곱근이 특히 반경과 비교할 때 의미있는 것이었지만, 실제로는 무언가를 사용하지 않고 그냥 예를 들고있는 것처럼 보였습니다. – jason

답변

2

프레임 워크가 메서드를 SQL로 변환하는 방법을 파악할 수 없기 때문에. 그렇게하기 위해 프레임 워크를 너무 많이 요구하고 있습니다. 쿼리 공급자가 식 트리 (Expression.Call)에서 메서드 중 하나에 대한 호출을 발견하면 호출되는 메서드가 파싱 및 적절하게 처리하는 방법을 알지 못하는 것입니다.

그러나 제공된 쿼리는 이렇게 설계되어 있기 때문에 Math.PowPOWER으로 변환하는 방법을 알고 있습니다.

정말 간단합니다.

+0

그래서 쿼리 내에서 사용할 수식을 통합 할 수 있습니까? 그게 유일한 방법이야? –

+0

@Shawn Mclean : 서버에서 사용자 정의 함수를 사용해 EF를 통해 모델로 가져올 수 있습니다. (서버에서 비즈니스 로직을 싫어할지라도이 일은 한번도 해본 적이 없지만 선택 사항입니다.) – jason

관련 문제