DataTableExtensions.AsEnumerable()抛出InvalidCastException

时间:2013-11-27 03:50:13

标签: c# linq linq-to-dataset

我正在使用DataTableExtensions.AsEnumerable方法来创建List。以下代码抛出InvalidCastException:

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

我不必使用LINQ,只需几次击键,我就可以使用foreach循环来处理数据表:

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;

好奇,我该如何修复LINQ?并且想知道在这里使用LINQ是否比某些保存的按键提供了任何优势。

2 个答案:

答案 0 :(得分:0)

你在一个案例中得到强制转换异常而在另一个案例中没有异常,因为Convert.ToDecimal比简单强制转换更宽松。 Cast异常表示基础字段decimal,但它的类型可以轻松转换为decimal

要在LINQ查询中使用Convert.ToDecimal,请按如下所示更改代码:

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

或者,您可以找出正确的类型,使用Field<correct-type>(...)进行阅读,然后执行转换为decimal

答案 1 :(得分:0)

这是因为您的某个列不是decimal

可能是例如int,即使它仍然是数字,您可以将int转换为decimal,因为.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得到InvalidCastExceptionConvert.ToDecimal看起来不同:

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

这就是它起作用的原因。