C# C左键连接两个数据表

C# C左键连接两个数据表,c#,mysql,.net,sql-server,datatable,C#,Mysql,.net,Sql Server,Datatable,我正在查询SQL server和MySQL服务器,然后使用结果MySQL数据表对结果SQL数据表进行左联接 但是,我在尝试使用连接的数据创建新的datatable时出错 以下是表格结构: SqlDataTable MySqlDataTable ------------- --------------- UserID, Field1 SiteUserID, Field2 200, 12 200,

我正在查询SQL server和MySQL服务器,然后使用结果MySQL数据表对结果SQL数据表进行左联接

但是,我在尝试使用连接的数据创建新的datatable时出错

以下是表格结构:

SqlDataTable           MySqlDataTable
-------------          --------------- 
UserID, Field1         SiteUserID, Field2 
200,    12              200,       25
这是我的代码片段。我在倒数第二行的mySqlDataRows中遇到上下文错误:

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<string>("UserID") equals 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 : mySqlDataRows.Field<int>("Field2") //The name 'mySqlDataRows' does not exist in the current context 
    }, false);

您应该从最终连接的对象(即r)中进行选择

 var result = from sqlDataRows in sqlDataTable.AsEnumerable()
                    join mySqlDataRows in mySqlDataTable.AsEnumerable()
                        on sqlDataRows.Field<string>("UserID") equals mySqlDataRows.Field<string>("SiteUserID") into lj
                    from r in lj.DefaultIfEmpty()
                    select dtResult.LoadDataRow(new object[]
                    {
                        r.Field<int>("UserID"),
                        r.Field<string>("Field1"),
                        r == null ? 0 : r.Field<int>("Field2")
                        //The name 'mySqlDataRows' does not exist in the current context 
                    }, false);

你最好用手来做这件事,而不是试图装模作样,在一个大的LINQ声明中完成这一切。如果您将两组数据检索到强类型对象集合中,然后在搜索另一个对象的同时循环其中一组,并将它们组合到更好的强类型集合中,您所做的事情将更加清楚,并且可能执行完全相同的操作,因为这正是LINQ在幕后要做的。我试图避免这种做法,因为我想熟悉LINQ,更喜欢这种形式的语言简洁。这两种解决方案都不起作用。尽管sqlDataTable和mySqlDataTable都填充了多行,但我最终得到了一个没有行的datatable。顺便说一句,我需要它来保留原始sqlDataTable,只需添加来自mySqlDataTable的记录,其中的任何sqlDataTable.UserID==mySqlDataTable.SiteUserID
var result = from sqlDataRows in sqlDataTable.AsEnumerable()
                join mySqlDataRows in mySqlDataTable.AsEnumerable()
                    on sqlDataRows.Field<int>("UserID") equals mySqlDataRows.Field<int>("SiteUserID")
                select dtResult.LoadDataRow(new object[]
                {
                    sqlDataRows.Field<int>("UserID"),
                    sqlDataRows.Field<string>("Field1"),
                    mySqlDataRows == null ? 0 : mySqlDataRows.Field<int>("Field2")
                }, false);