2015-01-13 3 views
0

Convert.ToInt32/Parse.Int에 문제가 있습니다. DB의 내 열은 varchar 유형이므로> = 연산자를 사용하여 Int32 유형과 비교해야합니다. 여기에 제가 사용하고있는 코드의 일부가 있습니다.Int를 문자열로 변환 LinqToENTITIES

var municipio = this.MunicipioRepository.Find(x => ((Int32.Parse(cep) >= 
                Int32.Parse(x.CEPInicial))) && 
          ((Int32.Parse(cep) <= Int32.Parse(x.CEPFinal)))); 

고맙습니다.

+0

처음에는 Convett.ToInt32와 Int32.Parse를 둘 다 사용할 필요가 없습니다. 'CEPInicial'과'CEPfinal'의 유형은 무엇입니까? 나는'cep'이 에러없이 변환 될 수 있거나'int'로 파싱 될 수있는 문자열이라고 생각합니다. 옳은? – Christos

+0

죄송합니다. 일부 실험 결과는 실제로 Parse, CEPInicial 및 CEPFinal 만 DB –

+0

의 문자열 유형입니다. 좀 더 구체적으로 말씀해주십시오. –

답변

0

짧은 대답은 "할 수 없다"입니다.

EF는 다양한 Linq 메서드를 사용하여 표현식 트리를 Sql으로 변환하려고 시도합니다.

EF 공급자는 Int32.Parse 또는 Convert.ToInt32를 SQL로 변환하는 방법을 알지 못하므로 사용자를 차단합니다.

당신이 할 수있는 유일한 방법은 성능 저하가 될 수 있지만, DB에서 비교할 필요가있는 모든 항목을 읽고 구체화 한 다음 그 시점부터는 Linq2Objects가 아닌 Linq2Entities가되고 더 이상 허용되지 않습니다. 너는 너가 원하는 무엇이든을 사용하기 위하여.

예를 들어 전체 테이블이 구체화 될 수 있습니다. 테이블이 작은 조회라면 문제는 없지만 그렇지 않으면 응용 프로그램이 실제로 종료 될 수 있습니다.

이 작업을 수행하려면 앞에 ToArray() 또는 ToList() 전화를 걸면됩니다.

그러나 데이터베이스에서 작업 할 기회가 있으면 훨씬 더 깨끗한 작업을 수행 할 수 있습니다. 변환 된 문자열 값을 정수로 반환하는 계산 된 열을 만든 다음 EF 모델에서이 새 열을 매핑하고 비교를 위해이 방법을 사용하면 캐스팅이 필요없이 INT와 INT를 비교할 수 있습니다. 성능이 현저하게 향상 될 것입니다. 물론 cep 매개 변수도 정수 여야하며 문제없이 사용할 수 있도록 Linq 쿼리 외부로 변환해야합니다.

+0

이제 나는 downvote에 대해 궁금합니다. 내 대답은 정확하고 오히려 완벽합니다. 나는 그것에 관심이 없다, 단지 호기심. –

+0

"SqlFunctions"클래스를 잘 알고 있으며 언급하지 않은 확실한 이유가 있습니다.Linq 질의는 재사용이 가능하며 밑에있는 실제 공급자로부터 추출됩니다. "SqlFunctions"클래스는 System.Data.Objects.SqlClient 네임 스페이스에 상주합니다.이 네임 스페이스는 기본 공급자에 한정되지 않습니다. 그래서 Linq 쿼리에서 사용하는 것이 좋은 선택이라고 생각하지 않습니다. –

+1

나는 사장님과 이야기하려고 할 것입니다. 아마 DB를 약간 변경할 수 있습니다. 분명히하기 위해 당신을 떨어 뜨린 것은 내가 아니 었습니다. 시간을 내고 매우 완전하고 명확한 답변을 보내 주셔서 감사합니다. –

관련 문제