C# 左连接两个数据表

标签 c# mysql .net sql-server datatable

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

但是,在尝试使用连接的数据创建新数据表时出现错误。

这些是表结构:

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

问题是 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);

关于C# 左连接两个数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238941/

相关文章:

c# - 检查 Entity Framework linq 结果中的项目

c# - Asp.net Core 中的条件依赖解析

C# 在 Linq 中动态构建 where 子句?对于乌鸦数据库

c# - ECDH Nodejs 和 C# key 交换

mysql - Perl、子项和共享数据

.net - 将整个文件夹上传到FTP的PowerShell脚本

c# - Guid.ToByteArray() 是跨平台的吗?

sql - 跳过行中的重复条目 (MySQL)

php - MYSQL 出现重复错误

c# - 如何从一些由 .NET EmailAddress DataAnnotation 支持的 POST 表单数据中修剪空格