C# 指定的强制转换无效-C

C# 指定的强制转换无效-C,c#,C#,我已经在SQL server中创建了一个表,其列OrderId为BigInt数据类型。当我在c中比较两个数据表时,我得到了以下错误 指定的强制转换无效 代码如下 var idsNotInB = dt.AsEnumerable().Select(r => r.Field<long>("OrderId")) .Except(dt1.AsEnumerable().Select(r => r.Field<long>("OrderId")))

我已经在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代码

试着投长?而不是长的。 如MZetko错误地提到的,如果列在DB中可为null,则可能发生这种情况

是否尝试强制转换为long?而不是长的。 如MZetko错误地提到的,如果该列在DB中可为null,则可能会发生这种情况。

似乎该方法在尝试从基础数据库表取消装箱时抛出了一个错误。请检查表dt和dt1中的所有值是否都可转换为长:

dt                  // check it also for dt1
  .AsEnumerable()
  .SelectMany(_ => _.ItemArray)
  .Select(_ => new { Value = _, Type = _.GetType() })
  .Where(_ => _.Type != typeof(long))
  .ToList()
  .ForEach(Console.WriteLine);
在这种情况下,通过强制转换到对象然后再转换到字符串来解决一些问题会有所帮助:

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();
似乎该方法在尝试从基础数据库表取消装箱值时抛出错误。请检查表dt和dt1中的所有值是否都可转换为长:

dt                  // check it also for dt1
  .AsEnumerable()
  .SelectMany(_ => _.ItemArray)
  .Select(_ => new { Value = _, Type = _.GetType() })
  .Where(_ => _.Type != typeof(long))
  .ToList()
  .ForEach(Console.WriteLine);
在这种情况下,通过强制转换到对象然后再转换到字符串来解决一些问题会有所帮助:

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();

数据库中的OrderId列可以为空吗?调试并观察DataTable使用的数据类型。Field方法非常严格。在…equals longOrderId中OrderId的类型是什么?两个表中该列的Allow Nulls都是false非Nullable。我也使用了相同的错误。还有其他想法吗…@RaufAbid您是否对数据库中表dt和dt1中的OrderId字段使用了bigint数据类型?数据库中的OrderId列是否可以为空?调试并观察数据表使用的数据类型。Field方法非常严格。在…equals longOrderId中OrderId的类型是什么?两个表中该列的Allow Nulls都是false非Nullable。我也使用了相同的错误。还有其他想法吗…@RaufAbid您是否对数据库中表dt和dt1中的OrderId字段使用了bigint数据类型?谢谢您的回复。我检查了这两个dt,但在这两个“dt”中除了长数据类型之外什么都没有找到。但幸运的是,您的第二种方法工作得很好。我有一个小问题:它能适应类型并准确快速地工作,而不是使用长数据类型吗?非常感谢:@RaufAbid由于字符串转换和字符串比较可能会产生一定的速度开销,但结果应该是准确的。谢谢。最后一个问题:如何计算:var idsNotInB。非常感谢..@RaufAbid一个可能的解决方案:dt.aseneumerable.Select=>\u[OrderId].ToString.Exceptdt1.aseneumerable.Select=>\u[OrderId].ToString.Count;谢谢@Andriy!帮助我到最后:谢谢你的回复。我检查了这两个dt,但在这两个“dt”中除了长数据类型之外什么都没有找到。但幸运的是,您的第二种方法工作得很好。我有一个小问题:它能适应类型并准确快速地工作,而不是使用长数据类型吗?非常感谢:@RaufAbid由于字符串转换和字符串比较可能会产生一定的速度开销,但结果应该是准确的。谢谢。最后一个问题:如何计算:var idsNotInB。非常感谢..@RaufAbid一个可能的解决方案:dt.aseneumerable.Select=>\u[OrderId].ToString.Exceptdt1.aseneumerable.Select=>\u[OrderId].ToString.Count;谢谢@Andriy!帮助我直到最后: