【问题标题】:c# Left joining 2 DataTablec#左加入2个DataTable
【发布时间】:2020-01-19 18:12:48
【问题描述】:

我有 2 个数据表,两个表上都没有主键。我需要将 DataTable1 中的所有记录与 DataTable2 连接起来。我已经解决了几种方法,但它们是否有效?

Column2 是软“键”,我正在尝试从 DataTable2 填充 DataTable1 中的第 3 列字段。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt1 = new DataTable();
            dt1.Columns.Add("col1", typeof(int));
            dt1.Columns.Add("col2", typeof(string));
            dt1.Columns.Add("col3", typeof(string));
            dt1.Rows.Add(1, "One");
            dt1.Rows.Add(1, "Two");
            dt1.Rows.Add(3, "Two");
            DataTable dt2 = new DataTable();
            dt2.Columns.Add("col1", typeof(int));
            dt2.Columns.Add("col2", typeof(string));
            dt2.Columns.Add("col3", typeof(string));
            dt2.Rows.Add(1, "One", "One Description");
            dt2.Rows.Add(2, "Two", "Two Description");

            //Solution 1
            //foreach (DataRow row in dt1.Rows)
            //{
            //    row[2] = dt2.Select("col2='" + row[1] + "'")[0]["col3"];
            //}

            foreach (DataRow row in dt1.Rows)
            {
                row[2] = dt2.AsEnumerable().Where(x => x["col2"] == row[1]).FirstOrDefault()[2];
            }

            dt1.AsEnumerable().ToList().ForEach(x =>
            Console.WriteLine(
                "col1:{0} col2:{1} col3:{2}"
                , x[0], x[1], x[2])
            );
        }
    }
}

奖励:我尝试将其复制到 .Net Fiddle 中,但它似乎不喜欢 DataTable 上的 AsEnumerable。 Go .Net Fiddle

【问题讨论】:

  • 从哪里获取数据表的数据?
  • 一个来自 API,另一个来自存储过程
  • 首先我会使用数据,而不是数据表。然后,如果您的第二个数据集具有唯一键(例如“一”、“二”),我会从中制作一个字典以使搜索更快。迭代第一个数据集并在字典中找到描述值。

标签: c#


【解决方案1】:

您可以为此使用LINQ GroupJoin

var result = dt1.Select()
    .GroupJoin(dt2.Select(), t1 => t1[1], t2 => t2[1], (t1, t2) => { t1[2] = t2.FirstOrDefault()?[2]; return t1; })
    .ToList();

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2015-09-22
    相关资源
    最近更新 更多