2013-11-27 1 views
1

DataTableExtensions.AsEnumerable 메서드를 사용하여 목록을 만듭니다.DataTableExtensions.AsEnumerable()이 InvalidCastException을 throw합니다.

i.Price = Convert.ToDecimal(row["Price"]); 
var saleDiscount = Convert.ToDecimal(row["SaleDiscount "]); 
i.SalePrice = i.Price - (i.Price * saleDiscount); 
i.SaleDiscount = i.Price - i.SalePrice; 

그냥 궁금 : 내가 foreach는 루프를 사용하여 데이터 테이블을 통해 작동 할 수있는 몇 키 입력으로 LINQ를 사용할 필요가 없습니다

SaleDiscount = (i.Field<decimal>("OnSalePercentAdjustment") * i.Field<decimal>("Price")), 

: 다음 코드는 InvalidCastException이 던지고 , 어떻게 LINQ를 고칠 수 있습니까? 여기 LINQ를 사용하면 저장된 키 스트로크보다 장점이 있는지 궁금해집니다.

+1

열 중 하나에 '십진수'유형이 없다고 확신합니다. –

답변

0

캐스팅 예외는 하나의 경우에 발생하고 다른 예외는 발생하지 않으므로 Convert.ToDecimal은 단순한 캐스팅보다 훨씬 관대합니다. 캐스트 예외는 기본 필드가 이 아니고decimal이 아니지만 쉽게 decimal으로 변환 될 수있는 유형임을 나타냅니다. 읽어 Field<correct-type>(...)를 사용

SaleDiscount = (
      Convert.ToDecimal(i.Field<object>("OnSalePercentAdjustment")) * 
      Convert.ToDecimal(i.Field<object>("Price"))), 

또는 올바른 유형을 알아낼 수 있으며, 다음 decimal에 캐스트를 수행

는 다음과 같이 코드를 변경, LINQ 쿼리 내부 Convert.ToDecimal를 사용하십시오.

+0

당신과 Marcin이 모두 그것을 못 박았습니다. 당신이 나에게 새로운 LINQ를 가르쳐 줬기 때문에 이것을 답으로 확인하십시오. 감사! – GDB

0

귀하의 열 중 하나가 decimal이 아니기 때문입니다.

int, 그리고 그것은 여전히 ​​숫자에도, 당신은 decimalint 캐스팅 할 수 .Field<T> 논리처럼 보이기 때문에 :

return (T)((object)value); 

을하고는 동일한에 유일한 언 박스 값은 그들은에서 박스 한 수 있기 때문에 :

int value = 3; 
object boxedValue = value; 

// works fine 
int unboxedValue = (int)boxedValue; 
// throws exception 
double unboxedValueAsDouble = (double)boxedValue; 

yu는 InvalidCastException입니다. Convert.ToDecimal 다른 것처럼 보입니다 :

return ((IConvertible)value).ToDecimal(null); 

그래서 그것이 작동하는 이유입니다.

+0

좋은 캐치! 데이터베이스 가격은 MONEY이고 할인율은 FLOAT입니다. – GDB

+0

@ GDB는 upvote를 저장하지 않습니다. :) 답변을 수락하는 것이 단 1 개만 가능하다는 것을 알고 있습니다. 그러나 다른 답변도 도움이 될 수 있으므로 upvoting은 응답자에게 감사의 말을 전하는 방법입니다. –

관련 문제