2011-04-05 8 views
3

나는 간단한 SQL 쿼리를 가지고 있지만, 메신저 내가이 아래 시도 LINQLINQ에서이 SQL을 수행 할 수 있습니까?

select top 1 * from tbl_CarTax tax 
ORDER BY ABS(tax.C02_From - 286.0) 

에 복제하는 데 어려움을 겪고하지만 난 ... 오류를 얻을 수 - 방법 'INT32 ToInt32를 인식하지 못하는 엔티티에 LINQ (시스템 .Object) '메서드를 사용하고이 메서드는 저장소 식으로 변환 할 수 없습니다.

TaxCost = (from tax in db.DB2011_Vehicle_CarTax 
orderby Math.Abs(Convert.ToInt32(C02Level - tax.C02_From)) 
select tax).SingleOrDefault(); 

어떤 도움을 가장

Truegilly

을 appriciated됩니다
+1

C02Level 및 tax.C02_From 속성의 유형은 무엇입니까? – SWeko

+0

'C02Level'과'tax.C02_Form'의 데이터 타입은 무엇입니까? 데이터 유형 변환 문제가있을 수 있습니다. –

+0

C02Level은 double이며 세금입니다 .C02_From은 int입니다. – JGilmartin

답변

5

Convert.ToInt은 필요하지 않습니다. 또한 FirstOrDefaulttop 1과 같습니다. SingleOrDefault은 쿼리 결과 둘 이상의 행이 반환되는 경우 예외를 throw합니다.
이 코드를 사용해보십시오 : 엔티티 프레임 워크는이 방법을 알고 SQL로 변환 할 수 있기 때문에 다른 대답과는 대조적으로

TaxCost = (from tax in db.DB2011_Vehicle_CarTax 
      orderby Math.Abs(C02Level - tax.C02_From) 
      select tax).FirstOrDefault(); 

, 나는, Math.Abs을 사용하지 않도록 할 필요를 볼 수 없습니다.

+1

소수 자릿수를 버려야 할 경우 LINQ에서 EF로 잘 변환되는 Math.Floor를 호출 할 수 있습니다. – Equiso

+0

Linq to Entities는 Math.Abs를이 transact SQL 함수로 변환합니다. ABS() –

0

당신은 풀다운 할 수있는 많은 정보가 있다면 모든 데이터가 다음 아마도 느린 레코드 세트 (에 Math.Abs을 사용하여 풀다운 수 있습니다)이, 또는 당신은 같은 것을 할 수 있습니다

(from tax in db.DB2011_Vehicle_CarTax 
let level = C02Level - tax.C02_From 
let abs = (level < 0) ? (level * -1) : level 
orderby abs 
select tax).SingleOrDefault(); 

이 할 수있는 합법적 방법이있을 수 있지만이 빠른 경우 충분히 작동합니다.

편집 - 실제로 Math.Abs는 SQL로 잘 해석됩니다. Convert.Int32를 제거하면 정상적으로 작동합니다.

관련 문제