【问题标题】:C# left join two datatablesC#左连接两个数据表
【发布时间】:2015-05-28 03:16:47
【问题描述】:

我正在查询 SQL 服务器和 MySQL 服务器,然后使用生成的 MySQL 数据表对生成的 SQL 数据表进行左连接。

但是,我在尝试使用连接数据创建新数据表时遇到错误。

这些是表结构:

SqlDataTable           MySqlDataTable
-------------          --------------- 
UserID, Field1         SiteUserID, Field2 
200,    12              200,       25

这是我的代码 sn-p。我在倒数第二行收到“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);

【问题讨论】:

  • 您最好手动执行此操作,而不是试图花哨并在一个大的 LINQ 语句中完成所有操作。如果您将两组数据都检索到强类型对象的集合中,然后循环其中一个,同时搜索另一个以寻找匹配项,并将它们组合成一个更好的强类型集合,那么您在做什么会更清楚,并且可能执行完全相同,因为无论如何这就是 LINQ 将在幕后做的事情。
  • 我试图避开这条路线,因为我想熟悉 LINQ,并且更喜欢这种形式的语言简洁。

标签: c# mysql .net sql-server datatable


【解决方案1】:

您应该从最终连接的对象中进行选择,即 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);

问题在于r 仅包含mySqlDataRows 表中的列,因为您使用了into 语句。 为什么需要这个声明:from r in sqlDataRows.DefaultIfEmpty()? 我在下面发布了一个有效的代码:

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

【讨论】:

  • 这两种解决方案都不起作用。尽管 sqlDataTable 和 mySqlDataTable 都填充了多行,但我最终得到了一个具有零行的数据表。
  • 顺便说一句,我需要它来保留原始的 sqlDataTable 并添加来自 mySqlDataTable 的记录,其中 sqlDataTable.UserID == mySqlDataTable.SiteUserID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多