2012-02-20 3 views
3

Entity Framework 데이터 소스를 기반으로하는 Linq로 쿼리를 만들고 있습니다.Linq to EF - 지원되지 않는 함수

나는 다음과 같은 오류를 받고 있어요 :

LINQ to Entities does not recognize the method 'Double Sqrt(Double)' method, and this method cannot be translated into a store expression.

여기 내 기능의 단순화 된 버전입니다 (내 버전은 더 복잡하고 ACOS, 죄, COS 및 기타 C# 수학 클래스 함수를 사용).

var objects = 
      from n in context.Products.Where(p => p.r == r) 
      let a = Math.Sqrt((double)n.Latitude) 
      where a < 5 
      orderby a 
      select n; 

     return objects.Take(100).ToList(); 

나는 문제가 Linq에 EF (그리고 SQL 데이터 소스)에 SQL Linq에 비교 지원 기능의 제한된 집합을 가지고있는 상황과 관련이있을 수 있습니다 생각합니다. 나는 이것에 상대적으로 새롭다 그래서 나는 100 % 확실하지 않다.

누구나 내게 올바른 방향으로 포인터를 줄 수 있습니까? 당신이 LINQ - 투 - 객체, 당신이로 실행하겠습니다로 LINQ 학습의 시작하는 경우

건배,

+1

http://stackoverflow.com/questions/1616235/using-sqrt-in-a-linq-ef-query/4119792#4119792 – Nix

답변

14

SquareRoot 기능 SqlFunctions

var objects = 
     from n in context.Products.Where(p => p.r == r) 
     let a = SqlFunctions.SquareRoot((double)n.Latitude) 
     where a < 5 
     orderby a 
     select n; 

    return objects.Take(100).ToList(); 
+0

이 문제가 해결되었습니다. 고맙습니다! – kodikas

1

var objects = 
     from n in context.Products.Where(p => p.r == r) 
     let a = Math.Pow((double)n.Latitude, 0.5) 
     where a < 5 
     orderby a 
     select n; 
5

에 정의하려고 시도하십시오 일단 LINQ-to-Entities를 사용하기 시작하면이 작업이 많이 필요합니다.

컴파일 할 때 LINQ에서 개체로 코드으로 변환되기 때문에 LINQ에서 개체로 컴파일되는 모든 작업을 수행 할 수 있습니다.

LINQ-to-Entities (및 LINQ-to-SQL)는 표현 트리으로 변환됩니다. 따라서 특정 LINQ 공급자가 허용 한 구문 만 유효합니다. LINQ-to-Entities에서 처리하지 않은 코드를 하나씩 제거하면서 약 5 번이 오류가 발생했습니다.

이렇게하면 정상적으로 보입니다. 매번 다른 방법을 찾아야합니다.

당신은 논리적으로 동등으로 문제를 피할 수

:

var objects = 
    from n in context.Products.Where(p => p.r == r) 
    where (double)n.Latitude < 25 
    orderby a 
    select n; 

return objects.Take(100).ToList(); 

또한 클라이언트에 모든 데이터를 끌어와 다음 LINQ - 투 - 개체를 사용하여 코드를 실행할 수 있습니다 :

var objects = 
    from n in context.Products.Where(p => p.r == r).ToList() 
    let a = Math.Sqrt((double)n.Latitude) 
    where a < 5 
    orderby a 
    select n; 

return objects.Take(100).ToList(); 

을 마지막으로 서버에서이 수학을 수행 할 수 있어야합니다. System.Data.Objects.SqlClient.SqlFunctionsSqlFunctions 클래스을 확인하십시오. 이러한 함수 이 표현식으로 변환됩니다. This in particular looks like it might be the ticket.

+0

SqlFunctions 클래스의 함수를 사용했습니다. 상세한 답변을 해줘서 고맙습니다. – kodikas

관련 문제