我正在使用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是否比某些保存的按键提供了任何优势。
答案 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得到InvalidCastException
。 Convert.ToDecimal
看起来不同:
return ((IConvertible)value).ToDecimal(null);
这就是它起作用的原因。