我在SQL Server中创建了一个表,其中OrderId列为BigInt数据类型。当我在c#中比较两个数据表时,我得到了以下错误。
指定演员阵容无效
代码如下。
var idsNotInB = dt.AsEnumerable().Select(r => r.Field<long>("OrderId"))
.Except(dt1.AsEnumerable().Select(r => r.Field<long>("OrderId")));
DataTable TableC = (from row in dt.AsEnumerable()
join OrderId in idsNotInB
on row.Field<long>("OrderId") equals (long)OrderId
select row).CopyToDataTable();
请提前指导如何处理此错误。
修改
请参阅下面的图片。我使用了bigint数据类型,之后我编写了上面的c#代码。
答案 0 :(得分:0)
尝试转换为long?
而不是long
。
如果列在DB中可以为空,则可能会发生这种情况,因为MZetko未正确提及
答案 1 :(得分:0)
似乎Field<T>
方法在尝试从基础数据库表中取消装箱时抛出InvalidCastException。您能否检查两个表dt和dt1中的所有值是否可转换为long:
dt // check it also for dt1
.AsEnumerable()
.SelectMany(_ => _.ItemArray)
.Select(_ => new { Value = _, Type = _.GetType() })
.Where(_ => _.Type != typeof(long))
.ToList()
.ForEach(Console.WriteLine);
在这种情况下,通过转换为object
然后转换为string
的小问题解决方法可以提供帮助:
var idsNotInB = dt
.AsEnumerable()
.Select(_ => _.Field<object>("OrderId").ToString())
.Except(dt1.AsEnumerable().Select(_ => _.Field<object>("OrderId").ToString()));
DataTable TableC = dt
.AsEnumerable()
.Where(_ => idsNotInB.Contains(_.Field<object>("OrderId").ToString()))
.CopyToDataTable();