2015-03-25 34 views
0

我正在使用以下代码在两个表之间执行左外连接;一个来自SQL,一个来自MySQL。基本上,我想获取生成的SQL数据表,向其中添加一列,并且如果在MySQL数据表中存在具有匹配UserID的行,请将该值添加到SQL数据表的新列中以获取匹配记录。C#LINQ生成“指定的转换无效”错误

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

但是,我得到一个“指定的转换无效”关于执行“选择dtResult.LoadDataRow”的路线错误。我一直无法弄清楚为什么,并且我已经三重检查了数据类型是否匹配。

+1

尝试删除'select'语句中的每一行,每次一个。转换那里的一个值可能会遇到麻烦。 – 2015-03-25 02:05:57

+0

顺便说一句,我发现它无法投射数据的原因是因为在幕后,“Field2”是一个MySQL Count()函数,它返回LONG数据类型,而不是INT! – blizz 2015-03-25 05:50:26

回答

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

这一过程被称为“投影”,你可以塑造但是得到的对象你想要的。但是,您将要为查询中的每条记录返回一个对象。你如何使用它取决于你。

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

+0

你其实是完全正确的,所以谢谢你! – blizz 2015-03-25 06:07:17

相关问题