我写了这段代码来找到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"))
为什么?
答案 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();