【问题标题】:Is there a way to join 2 data tables on multiple columns through Linq?有没有办法通过 Linq 连接多个列上的 2 个数据表?
【发布时间】:2020-06-30 04:47:13
【问题描述】:

我有两个数据表。

第一个表:

第二张桌子:

我想要以下结果:

但我得到的是这个结果:

这是我的代码:

table1.Columns.Add("D");

table1.AsEnumerable()
      .Join(table2.AsEnumerable(),
            dt1_Row => dt1_Row.ItemArray[0],                         
            dt2_Row => dt2_Row.ItemArray[0],
            (dt1_Row, dt2_Row) => new { dt1_Row, dt2_Row})
      .ToList()                         
      .ForEach(o => o.dt1_Row.SetField(3, o.dt2_Row.ItemArray[2]));

提前谢谢你!

【问题讨论】:

  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。 How to Ask
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。在总体目标的错误暂停工作中,将代码砍到第一个表达式中,而不是给出你所期望的,说出你所期望的以及为什么。
  • 谢谢@philipxy,我粘贴了图像,因为它速度很快,它准确地显示了我想要显示的内容,我在万维网上查看了所有可能的解决方案,我想我很清楚我想加入2个数据表,我不知道你哪里弄糊涂了,无论如何,谢谢你的时间,我真的很感激!
  • 我并不感到困惑,我正在告诉你一些事情来帮助你获得答案和支持而不是反对。

标签: c# linq join multiple-columns


【解决方案1】:

这是答案-

        DataRow dataRow = null;
        DataTable dt1 = new DataTable();
        dt1.Columns.Add("A");
        dt1.Columns.Add("B");
        dt1.Columns.Add("C");
        dataRow = dt1.NewRow();
        dataRow["A"] = "Australia";
        dataRow["B"] = "P1";
        dataRow["C"] = "15";
        dt1.Rows.Add(dataRow);

        dataRow = dt1.NewRow();
        dataRow["A"] = "Australia";
        dataRow["B"] = "P2";
        dataRow["C"] = "4";
        dt1.Rows.Add(dataRow);

        dataRow = dt1.NewRow();
        dataRow["A"] = "Australia";
        dataRow["B"] = "P3";
        dataRow["C"] = "4";
        dt1.Rows.Add(dataRow);

        dataRow = dt1.NewRow();
        dataRow["A"] = "Australia";
        dataRow["B"] = "P4";
        dataRow["C"] = "51";
        dt1.Rows.Add(dataRow);

        dataRow = dt1.NewRow();
        dataRow["A"] = "Australia";
        dataRow["B"] = "P5";
        dataRow["C"] = "4";
        dt1.Rows.Add(dataRow);

        dataRow = dt1.NewRow();
        dataRow["A"] = "Canada";
        dataRow["B"] = "P1";
        dataRow["C"] = "9";
        dt1.Rows.Add(dataRow);

        
        dataRow = dt1.NewRow();
        dataRow["A"] = "Canada";
        dataRow["B"] = "P2";
        dataRow["C"] = "5";
        dt1.Rows.Add(dataRow);

        dataRow = dt1.NewRow();
        dataRow["A"] = "Canada";
        dataRow["B"] = "P3";
        dataRow["C"] = "19";
        dt1.Rows.Add(dataRow);

        dataRow = dt1.NewRow();
        dataRow["A"] = "Canada";
        dataRow["B"] = "P4";
        dataRow["C"] = "79";
        dt1.Rows.Add(dataRow);

        dataRow = dt1.NewRow();
        dataRow["A"] = "Canada";
        dataRow["B"] = "P5";
        dataRow["C"] = "23";
        dt1.Rows.Add(dataRow);

        dt1.AcceptChanges();

        dataRow = null;
        DataTable dt2 = new DataTable();
        dt2.Columns.Add("A");
        dt2.Columns.Add("B");
        dt2.Columns.Add("D");
        dataRow = dt2.NewRow();
        dataRow["A"] = "Australia";
        dataRow["B"] = "P1";
        dataRow["D"] = "2";
        dt2.Rows.Add(dataRow);

        dataRow = dt2.NewRow();
        dataRow["A"] = "Canada";
        dataRow["B"] = "P1";
        dataRow["D"] = "3";
        dt2.Rows.Add(dataRow);

        dt2.AcceptChanges();


        var joinResult = (from p in dt1.AsEnumerable()
                          join t in dt2.AsEnumerable()
                          on new
                          {
                              A = p.Field<String>("A"),
                              B = p.Field<String>("B"),
                          } equals
                           new
                           {
                               A = t.Field<String>("A"),
                               B = t.Field<String>("B"),
                           }
                          into grp1
                          from tb3 in grp1.DefaultIfEmpty()
                          select new
                          {
                              A = p.Field<string>("A"),
                              B = p.Field<string>("B"),
                              C = p.Field<string>("C"),
                              D = tb3 == null ? "0" : tb3.Field<string>("D")

                          });

最后,您可以使用 foreach 循环枚举 A、B、C、D 字段。

【讨论】:

  • 谢谢你,我在这里和那里稍微调整了这段代码,但这正是我想要的,谢谢! :)
【解决方案2】:

我找到了以下解决方案:

var list1 = (from t1 in table1.AsEnumerable()
                         select new
                         {
                             A= t1.Field<string>("A"),
                             B = t1.Field<string>("B"),
                             C = t1.Field<int>("C").ToString(),
                             
                         });

            var list2 = (from b in table2.AsEnumerable()
                         select new
                         {
                             A = b.Field<string>("A"),
                             B = b.Field<string>("B"),
                             D = b.Field<int>("D").ToString(),
                             
                         });
            var result = (from x in list1.AsEnumerable()
                          join y in list2.AsEnumerable() on new { x.A, x.B } equals new { y.A, y.B } into xy
                           from y in xy.DefaultIfEmpty()
                          select new { x,xx = y == null ? "0" : y.D  }).ToList();
            

【讨论】:

  • 请不要发布仅代码的答案,解释它如何回答问题以及问题中的问题或误解是什么。
  • @philipxy 我能够在多个列上加入两个数据表,正如我在问题中解释的那样,我无法使用我在问题中发布的代码达到目标,最后我不得不更改代码(借助互联网),所以想在这里发帖,如果您有任何不明白的特定部分,请告诉我,我很乐意提供帮助!
  • 再次,我只是告诉您如何使用该网站来帮助自己和他人。 SO 的重点是收集好的问答,而代码转储不是好的答案。 How to Answerhelp center
  • 谢谢!我希望有好的问题可以回答!
【解决方案3】:

这还不够吗?

    var r = from t1 in table1
            from t2 in table2.Where(t=> t.A == t1.A && t.B == t1.B).Select(t=>t.D).DefaultIfEmpty()
            select new {t1.A, t1.B, t1.C, t2.D}

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多