在C#中自然加入两个DataTable

时间:2013-07-02 20:00:39

标签: c# asp.net datatable jointable

我有一个包含两个表的DataSet。一个被认为是嵌套在另一个..所有我想要的是它不是嵌套而且有一个表。 .Merge()和LINQ就是不行。

以下是主要表格的示例

student-id ID
--------------------
123456789 1
654987321 2

但是每个都有多行,它们在下一个表中对应

ID Col1 Col2
----------------------
1事实1事实2 1事实3事实4
2事实5事实6

我想将它们组合起来,看起来像这样...

student-id Col1 Col2
-------------------------------
123456789事实1事实2 123456789事实3事实4
654987321 fact5 fact6


每次我尝试合并它都不起作用我得到一个错误,我不能复制主键是“ID”,因为合并是基于主键(我相信)我不能删除它。

我不能使用LINQ,因为我想使这个通用,以便第二个表可以有任意数量的列,我不能让选择工作。

更新:我的解决方案 我最终将第二个表克隆到一个新的数据表。然后添加一个名为“student-id”的列并删除ID列。我遍历主表查找的行并将它们与第二个表中的行相关联...组合数组中的所有数据并在最终表中创建一行。

3 个答案:

答案 0 :(得分:0)

听起来你需要的是一个Pivot表。

这基本上允许您以您想要的方式显示数据。

以下是一些教程/项目

http://www.codeproject.com/Articles/25167/Simple-Advanced-Pivots-with-C-and-ASP-NET http://www.codeproject.com/Articles/46486/Pivoting-DataTable-Simplified

<强>更新

你可能会发现自己更好地做着“转动”。部分在MS SQL中作为存储过程,然后使用调用此存储过程的结果填充数据表。这个例子是一个很好的起点

http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx

答案 1 :(得分:0)

LINQ并不像你建议的那么糟糕。您可以使用包含两个DataRows的匿名类型:

var result = from t1 in table1.AsEnumerable()
             join t2 in table2.AsEnumerable() on (int)t1["ID"] equals (int)t2["ID"]
             select new
             {
                 Student = t1,
                 Facts = t2
             };
foreach(var s in result)
    Console.WriteLine("{0} {1} {2}", s.Student["student-id"], s.Facts["Col1"], s.Facts["Col2"]);

这样,您就不会在输出中包含特定列,因此您可以在事后查看它们。

话虽如此,另一张海报建议使用数据透视表可能是一个更好的方向。

答案 2 :(得分:0)

让我们在SQL中尝试。

设,第1表=表1和第2表=表2

SQL:

Select
    X.student-id,Y.Col1,Y.Col2
From Table1 As X Inner Join Table2 As Y On Y.ID=X.ID

我认为如果你在SQL中尝试它很容易做到!!!