C# LINQ 生成“指定的强制转换无效”错误

Posted

技术标签:

【中文标题】C# LINQ 生成“指定的强制转换无效”错误【英文标题】:C# LINQ generates "Specified cast is not valid" error 【发布时间】:2015-05-28 13:14:30 【问题描述】:

我正在使用以下代码在两个表之间进行左外连接;一个来自 SQL,一个来自 mysql。基本上,我想获取生成的 SQL 数据表,向其中添加一列,如果 MySQL 数据表中存在与 UserID 匹配的行,则将值添加到 SQL 数据表中的新列以获取匹配记录。

var dtResult = new DataTable();
dtResult.Columns.Add("UserID", typeof (int));
dtResult.Columns.Add("Field1", typeof (string));
dtResult.Columns.Add("Field2", typeof (int));

var result = from sqlDataRows in sqlDataTable.AsEnumerable()
    join mySqlDataRows in mySqlDataTable.AsEnumerable()
    on sqlDataRows.Field<int>("UserID") equals Convert.ToInt32(mySqlDataRows.Field<string>("SiteUserID")) into lj
    from r in lj.DefaultIfEmpty()
    select dtResult.LoadDataRow(new object[]
    
        sqlDataRows.Field<int>("UserID"),
        sqlDataRows.Field<string>("Field1"),
        r == null ? 0 : r.Field<int>("Field2")
    , false);

但是,我在执行“Select dtResult.LoadDataRow”的行上收到“Specified cast is not valid”错误。我无法弄清楚原因,我已经三次检查数据类型是否匹配。

【问题讨论】:

顺便说一句,我发现它无法转换数据的原因是,在幕后,“Field2”是一个 MySQL Count() 函数,它返回 LONG 数据类型,而不是 INT ! 【参考方案1】:

select 的结果是一个 IEnumerable。然后,您需要在每个结果项上 LoadDataRow - 您不能像您尝试那样内联。

例如:

var result = from sqlDataRows in sqlDataTable.AsEnumerable()
  join mySqlDataRows in mySqlDataTable.AsEnumerable()
  on sqlDataRows.Field<int>("UserID") equals Convert.ToInt32(mySqlDataRows.Field<string>("SiteUserID")) into lj
  from r in lj.DefaultIfEmpty()
  select new object[] 
  
    sqlDataRows.Field<int>("UserID"),
    sqlDataRows.Field<string>("Field1"),
    r == null ? 0 : r.Field<int>("Field2")
  ;

foreach (var item in result)

  dtResult.LoadDataRow(item, false);

此过程称为“投影”,您可以根据需要对生成的对象进行整形。但是,您将为查询中的每条记录返回一个对象。从那里如何使用它取决于您。

我从来没有做过这样的跨数据库(跨系统)连接,所以框架是否允许你这样做可能是你的下一个障碍。

【讨论】:

以上是关于C# LINQ 生成“指定的强制转换无效”错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 C# 中迭代​​ IEnumerable<int> 时,指定的强制转换无效

System.InvalidCastException:指定的强制转换无效。错误

指定的强制转换无效错误

执行标量();使用 scope_identity() 生成“System.InvalidCastException:指定的强制转换无效”[重复]

Xamarin 形式:System.InvalidCastException:“指定的强制转换无效。”

C#中的LINQ问题