0

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

这是主表的示例

学生    ID
--------------------
123456789 1
654987321 2

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

ID    Col1    Col2
----------------------
1 fact1 fact2
1 fact3 fact4
2 fact5 fact6

我想把它们结合起来,这样它们看起来像这样......

学生 ID    Col1    Col2
-------------------
123456789 fact1 fact2
123456789 fact3 fact4
654987321 fact5 fact6


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

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

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

4

3 回答 3

0

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

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

这里有几个教程/项目

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

于 2013-07-02T20:10:24.457 回答
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"]);

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

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

于 2013-07-02T20:14:44.427 回答
0

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

于 2013-07-02T20:21:36.530 回答