C#中两个数据表的自然联接

本文关键字:数据表 自然 两个 | 更新日期: 2023-09-27 18:20:43

我有一个包含两个表的数据集。一个被认为嵌套在另一个中。。我只想它不嵌套,只有一张表。Merge()和LINQ根本没用。

以下是主表的示例

学生id nbsp ID
--------------------
123456789;1
654987321;2

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

ID  第1列  Col2
----------------------
1 事实1 事实2
1 事实3 事实4
2 事实5 事实6

我想把它们组合起来,这样它们就会看起来像这样。。。

学生id nbsp 第1列  第2列
-------------------------------
123456789 事实1 nbsp;事实2
123456789 事实3 nbsp;事实4
654987321 事实5 nbsp;fact6


每次我尝试合并都不起作用,我都会收到一个错误,即我无法复制"ID"主键,并且由于合并是基于主键的(我相信),我无法删除它。

我不能使用LINQ,因为我想让它成为通用的,这样第二个表就可以有任意数量的列,而我无法让select为此工作。

更新:我的解决方案我最终将第二个表克隆到了一个新的数据表中。然后添加一个名为"student id"的列并删除id列。我循环浏览主表的行,找到并将它们与第二个表中的行关联。。。将数组中的所有数据组合在一起,并在最终表中创建一行。

C#中两个数据表的自然联接

LINQ并没有你建议的那么糟糕。您可以只使用一个包含两个DataRow的匿名类型:

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"]);

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

话虽如此,另一位发帖人建议使用透视表可能是一个更好的方向。

让我们在SQL中尝试一下。

设,第一个表=表1,第二个表=表格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中尝试它,它很容易做到!!!

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

这将基本上允许您按照自己的意愿显示数据。

以下是的几个教程/项目

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

更新

您可能会发现自己更好地将MSSQL中的"pivot"部分作为存储过程,然后用调用此存储过程的结果填充数据表。这个例子是一个伟大的开始块

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