【发布时间】: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#