2011-08-30 5 views
6

나는 다음과 같은 LINQ 문이 있습니다C# Convert.ToDouble 람다 LINQ 문에서 (값)

Items = Items.Where(p => p.LeadDatas.Any(
         q => 
         q.LeadField.Name == descriptor.Name && 
         Convert.ToDouble(q.Value) == Convert.ToDouble(value))); 

모두의 q.Value 이중의 문자열 값이며, value는 이중의 문자열 값입니다 이것들은 평등을 위해 비교 될 수 있도록 복식으로 변환 될 필요가 있었다. 나를 어떻게 허용하지 않습니다 이유는 확실하지 않다

을 떠

오류 변환 데이터 유형 VARCHAR :

내가이 LINQ 문을 통해 디버깅

, 나는 다음과 같은 예외 : SQLException을 얻고있다 이 문제는 해결할 수 있을지 궁금해합니다. 여기서 평등을 비교하기 위해 두 값을 비교해야합니다.

답변

7

시작하기 위해, 나는 로컬 변수에 밖으로 Convert.ToDouble(value)를 추출하는 것입니다 :

double target = Convert.ToDouble(value); 
Items = Items.Where(p => p.LeadDatas.Any(q => 
          q.LeadField.Name == descriptor.Name && 
          Convert.ToDouble(q.Value) == target)); 

을 그것은 매우 가능성이 문제의 value의 시도 전환보다는 일부 행 q.Value의 시도 변환이 있다고 . 또는 유효한 값이없는 행이있을 수도 있습니다. 처음에 간단한 평등 이진 부동 소수점 값을 비교

그러나, 그것은 또한 일반적이다 나쁜 생각 (... 당신은 double.TryParse를 사용하여을 시도 할 수 있지만, 난 그 일을 giong 얼마나 잘 모르겠어요) 장소. 어느 정도의 허용 오차를 사용할 수 있습니다. LINQ to SQL과 함께 작동하는 방법이 다른 문제입니다 ...

+0

SQL에서 수행하려고하는 것이 가능합니다. (오류 메시지 참조) – Jeff

+0

@ JeffN825 : 요점은 "고정 된"값의 변환을 시도 할 가능성이 있습니다 데이터베이스에있는 데이터를 변환하려는 시도가 아니라 문제입니다. 명확하게 편집 할 것입니다. –

+0

내 자신의 교육을 위해 복식을 비교하는 것이 왜 안 좋은가? 오래된 "10 진수"문제 때문에? (http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) – Jeff

0

LINQ to SQL을 사용하는 것처럼 보입니다. 이 오류는 쿼리를 실행하는 SQL Server에서 직접 발생합니다 (코드가 아님). 내 생각 엔 유효한 숫자 값이 아닌 값이있는 행이 있습니다.

나는 SSMS에서 다음 쿼리를 실행하는 것입니다 그리고 난 당신이 오류와 함께 실패 찾을 수 있다고 생각

Error Converting data type varchar to float 

select convert(float, value) from leaddata 

편집 :

당신이 존 제안으로 약간의 내결함성을 추가하려면 ISNUMERIC 기능을 매핑하고 아래 할 수있는 : 당신의 DBML (참조 How to know if a field is numeric in Linq To SQL)

<Function Name="ISNUMERIC" IsComposable="true"> 
    <Parameter Name="Expression" Parameter="Expression" Type="System.String" DbType="NVarChar(4000)" /> 
    <Return Type="System.Boolean" DbType="BIT NOT NULL"/> 
</Function> 
에서

코드에서

:

double target = Convert.ToDouble(value); 
Items = Items.Where(p => p.LeadDatas.Where(i => myDataContext.IsNumeric(i)).Any(q => 
          q.LeadField.Name == descriptor.Name && 
          Convert.ToDouble(q.Value) == target)); 
+0

나는이 솔루션을 좋아한다. 단점은 Item이 IQueryable 이므로이 함수에 액세스 할 수 있는가? – TheJediCowboy

+0

DBML에서 매핑하면 DataContext에서 IsNumeric 함수를 생성해야합니다. – Jeff

+0

DataContext와 완전히 독립적으로 선언하려면 DBML에 추가하고 여기에있는 정적 메서드에 매핑하십시오. http://msdn.microsoft.com/en-us/library/bb386973.aspx – Jeff

0

확인하면 SQL Server의 float로 변환하는 문자열 값이 유효한지 확인합니다 (예를 들어, 그들은 비어 있지 않거나 그들은 소수점에 대한 유효한 기호가).

0

값 중 하나가 성공적으로 float로 변환 될 수없는 것처럼 들립니다.