【问题标题】:Natural Join of two DataTables in C#C#中两个数据表的自然连接
【发布时间】:2013-07-02 20:00:39
【问题描述】:

我有一个包含两个表的数据集。一个被认为是嵌套在另一个中。我想要的只是它不被嵌套并且有一个表。 .Merge() 和 LINQ 并没有做到这一点。

这是主表的示例

学生证    身份证
--------------------
123456789 1
654987321 2

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

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

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

学生 ID    Col1    Col2
-------------------------------------------
123456789 事实 1 事实 2
123456789 事实 3 事实 4
654987321 事实5 事实6


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

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

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

【问题讨论】:

  • 在这里寻找一些例子Inner join of DataTables in C#
  • @RomanPekar 我对该示例的唯一问题是它指定了列,我想这样做,这样我就不必选择每一列......将会有一个种类繁多的列,它们都有不同的名称

标签: c# asp.net datatable jointable


【解决方案1】:

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

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

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

【讨论】:

  • 但是我可以加入这两行以在决赛桌中创建一行吗?我还需要最终表成为 DataTable
  • 好吧,如果我们假设您不知道架构(或者希望它足够通用以在不提供特定列的情况下工作),那么不。如果您确实知道这些列,那么将这些行重新组成一个 DataTable 会容易得多。
  • 我知道这些列,只是可能有大约 8 种列组合可以进来。所有这些列都有 16 到 34 列,所以显然更容易使其通用。但如果它不能使用通用方法,那么我可以用另一种方式来做。
  • 我这里还有一个问题...这些数据是来自数据库吗?如果是这样,您最好编写一个处理连接的视图。然后,您可以使用所需的确切列查询您的数据库视图,而不必担心在内存中执行连接。
  • 数据来自正在上传的文件
【解决方案2】:

让我们在 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 中尝试它很容易做到!!!

【讨论】:

  • 如果您不知道这两个表的架构(问题的前提)那么不,这在 SQL 中不容易
【解决方案3】:

听起来您需要的是一个数据透视表。

这基本上可以让你以你想要的方式显示数据。

这里有几个教程/项目

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

【讨论】:

  • 我的数据不是数字和它的所有字符串是否重要。最终表(第三个)也需要是 DataTable 类型的数据透视表还有用吗?
  • 数据透视表不仅仅是 .net 的东西 - 它是一种显示数据的方式。您基本上希望能够在不重复学生的情况下显示每个学生及其“事实”。这就是数据透视表可以做的事情。您可以使用数据透视的结果填充数据表。我会为您找到一个很好的 SQL 教程 - 让 SQL 创建数据透视表可能更容易,您只需使用它的响应填充 Datatable。
  • 为了确保我们清楚“重复学生”的问题,我希望学生 ID 在决赛桌中出现两次,例如,fact1 和 fact2 与 fact3 和 fact4 分开
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 2018-07-21
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多