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

时间:2015-03-25 01:30:13

标签: c# mysql sql linq datatable

我使用以下代码在两个表之间进行左外连接;一个来自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”的行上收到“指定的强制转换无效”错误。我无法弄清楚为什么,我已经三次检查数据类型是否匹配。

1 个答案:

答案 0 :(得分: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);
}

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

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