我被这个难住了。
我正在尝试将两个DataTable
s 合并为一个。最好我会用它linq
来执行这个任务,但问题是我需要动态地为连接添加条件。每个表的数据来自对存储过程的两个不同调用,并且可以切换使用哪些调用。因此,结果可以在列数和可用的主键上有所不同。
目标是用可以包含 unicode 的第二个数据库替换第一个结果集中的常规字符串(但前提是它包含该特定主键组合的值)。
我的 linq 查询如下所示:
var joined = (from DataRow reg in dt1.Rows
join DataRow uni in dt2.Rows
on new { prim1 = reg.ItemArray[0], prim2 = reg.ItemArray[1] }
equals new { prim1 = uni.ItemArray[0], prim2 = uni.ItemArray[1] }
select new
{
prim1 = reg.ItemArray[0],
prim2 = reg.ItemArray[1],
value1 = reg.ItemArray[4],
value2 = uni.ItemArray[3] ?? reg.ItemArray[3]
}
);
这非常适合我想要的,但正如我所说,我需要能够定义每个表中的哪些列是主键,所以这个:
join DataRow uni in dt2.Rows
on new { prim1 = reg.ItemArray[0], prim2 = reg.ItemArray[1] }
equals new { prim1 = uni.ItemArray[0], prim2 = uni.ItemArray[1] }
需要替换为DataRelation
在表之间或在执行linq
动态添加主键之前创建 a 之类的东西。
另外,我需要使选择类似于 SQL *
,而不是指定每一列,因为我不知道第一个结果集中的列数。
我还尝试通过添加主键并进行合并来加入表,但是我如何选择 dt2 中的哪一列来覆盖 dt1 中的哪一列?
DataTable join = new DataTable("joined");
join = dt1.Copy();
join.Merge(dt2, false, MissingSchemaAction.Add);
join.AcceptChanges();
我正在使用VS2012。