【问题标题】:Left join two datatables asp net c# LINQ左连接两个数据表asp net c# LINQ
【发布时间】:2018-01-04 12:04:34
【问题描述】:

例如,我在连接两个数据表时遇到问题:

table1        table2
ID, name       ID, stock
1, item1       1, blabla
1, item2       3, bla2   
3, item3

左加入后应该是这样的:

   table3       
ID, name, stock       
1, item1, blabla       
1, item2, blabla         
3, item3, bla2

但它看起来像这样:

   table3    
ID, name, stock       
1, item1,        
1, item2,         
3, item3, 

这是我的代码:

var rowDataLeftOuter = from rowLeft in dtblLeft.AsEnumerable()
                       join rowRight in dtblRight.AsEnumerable() on rowLeft[colToJoinOn] equals rowRight[strTempColName] into gj
                       from subRight in gj.DefaultIfEmpty()
                       select rowLeft.ItemArray.Concat((subRight == null) ? (dtblRight.NewRow().ItemArray) : subRight.ItemArray).ToArray();

foreach (object[] values in rowDataLeftOuter)
                    dtblResult.Rows.Add(values);

Orginal code

【问题讨论】:

  • “colToJoinOn”和“strTempColName”的值是多少?
  • colToJoinOn = id and strTempColName = id_2 => 表示它来自table2的ID
  • 如果您在两个表之间进行左连接并且只有左部分有值,可能是因为您的连接条件错误。
  • 不,这很好,因为它已经过检查。两个表具有相同的列名。

标签: c# asp.net linq


【解决方案1】:

不确定连接中列的值是什么 - colToJoinOnstrTempColName 但是以下给出了您正在寻找的结果:

        const string columnNameId = "Id";

        var dtblLeft = new DataTable();
        dtblLeft.Columns.Add(new DataColumn(columnNameId, typeof(int)));
        dtblLeft.Columns.Add(new DataColumn("Name", typeof(string)));

        var dr1 = dtblLeft.NewRow();
        dr1[columnNameId] = 1;
        dr1["Name"] = "item1";
        dtblLeft.Rows.Add(dr1);
        var dr2 = dtblLeft.NewRow();
        dr2[columnNameId] = 1;
        dr2["Name"] = "item2";
        dtblLeft.Rows.Add(dr2);
        var dr3 = dtblLeft.NewRow();
        dr3[columnNameId] = 3;
        dr3["Name"] = "item3";
        dtblLeft.Rows.Add(dr3);

        var dtblRight = new DataTable();
        dtblRight.Columns.Add(new DataColumn(columnNameId, typeof(int)));
        dtblRight.Columns.Add(new DataColumn("Stock", typeof(string)));

        var dr4 = dtblRight.NewRow();
        dr4[columnNameId] = 1;
        dr4["Stock"] = "blabla";
        dtblRight.Rows.Add(dr4);
        var dr5 = dtblRight.NewRow();
        dr5[columnNameId] = 3;
        dr5["Stock"] = "bla2";
        dtblRight.Rows.Add(dr5);

        var dtblResult = new DataTable();
        dtblResult.Columns.Add(new DataColumn(columnNameId, typeof(int)));
        dtblResult.Columns.Add(new DataColumn("Name", typeof(string)));
        dtblResult.Columns.Add(new DataColumn("Stock", typeof(string)));

        var result = from rowLeft in dtblLeft.AsEnumerable()
            join rowRight in dtblRight.AsEnumerable() on rowLeft[columnNameId] equals rowRight[columnNameId] into gj
            from subRight in gj.DefaultIfEmpty()
            select dtblResult.NewRow().ItemArray = new[]
            {
                rowLeft[columnNameId],
                rowLeft["Name"],
                subRight?["Stock"] ?? ""
            };

        foreach (var dataRow in result)
        {
            dtblResult.Rows.Add(dataRow);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-09
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多