C# LINQ 生成 "Specified cast is not valid" 错误
C# LINQ generates "Specified cast is not valid" error
我正在使用以下代码在两个表之间进行左外连接;一位来自 SQL,一位来自 MySQL。基本上,我想获取结果 SQL 数据表,向其中添加一列,如果 MySQL 数据表中有匹配 UserID 的行,则将该值添加到 [= 中的新列20=] 匹配记录的数据表。
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" 错误。我一直无法弄清楚为什么,我已经三次检查数据类型是否匹配。
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);
}
此过程称为 "projection",您可以根据需要塑造生成的对象。但是,您将为查询中的每条记录取回一个对象。如何使用它取决于您。
我从来没有做过这样的跨数据库(跨系统)连接,所以框架是否允许你这样做可能是你的下一个障碍。
我正在使用以下代码在两个表之间进行左外连接;一位来自 SQL,一位来自 MySQL。基本上,我想获取结果 SQL 数据表,向其中添加一列,如果 MySQL 数据表中有匹配 UserID 的行,则将该值添加到 [= 中的新列20=] 匹配记录的数据表。
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" 错误。我一直无法弄清楚为什么,我已经三次检查数据类型是否匹配。
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);
}
此过程称为 "projection",您可以根据需要塑造生成的对象。但是,您将为查询中的每条记录取回一个对象。如何使用它取决于您。
我从来没有做过这样的跨数据库(跨系统)连接,所以框架是否允许你这样做可能是你的下一个障碍。