无法转换类型为' System.Decimal'的对象输入' System.String'

时间:2015-03-09 08:08:15

标签: c# linq

我写了这段代码来找到dtExistCosts中的哪一个没有,退出在costsList中。

var costMustbeDeleteDt = (
        from e in dtExistCosts.AsEnumerable()
        where !(from c in costsList 
                select Convert.ToString(c.CostRecordId))
                            .Contains(e.Field<string>("DETAIL_HAZ_PK"))
        select e).CopyToDataTable();

但是当我运行它时,我收到错误:

  

无法将System.Decimal类型的对象转换为System.String

类型

in

!(from c in costsList 
  select Convert.ToString(c.CostRecordId))
        .Contains(e.Field<string>("DETAIL_HAZ_PK"))

为什么?

2 个答案:

答案 0 :(得分:1)

.Contains(e.Field<string>("DETAIL_HAZ_PK"))

异常应该在这一行,你不能对建议的异常进行显式的十进制转换。

您可以这样做:

.Contains(Convert.ToString(e.Field<decimal>("DETAIL_HAZ_PK")))

当然,直接按小数比较值应该是这种情况,但这回答了你的问题。

答案 1 :(得分:0)

看起来你试图在比较它们之前将两个数值(c.CostRecordId和“DETAIL_HAZ_PK”的值)转换为字符串,这不仅是不必要的,而且还会导致你所描述的错误。

请改为尝试:

var costMustbeDeleteDt = (from e in dtExistCosts.AsEnumerable()
  where !(from c in costsList select c.CostRecordId)
      .Contains(e.Field<decimal>("DETAIL_HAZ_PK"))
  select e).CopyToDataTable();

此外,我建议通过引入costList ID的变量并将LINQ查询转换为方法链语法来提高选择的可读性:

var costsListIds = costsList.Select (c => c.CostRecordId);

var costMustbeDeleteDt = dtExistCosts
    .Where (existCost => !costsListIds.Contains (existCost.Field<decimal>("DETAIL_HAZ_PK"))
    .CopyToDataTable();