c#中多个表的联合
本文关键字: | 更新日期: 2023-09-27 17:49:35
我正在使用c#,并试图在代码中对多个数据表进行联合。
Table 1
ID | Value | Value2
-----------------
1 | Tom | Null
-----------------
2 | John | Null
-----------------
...
Table 2
ID | Value | Value2
-----------------
1 | Null | Susie
-----------------
2 | Null | Kim
-----------------
...
结果表应该是
TableResult
ID | Value | Value2
-----------------
1 | Tom | Susie
-----------------
2 | John | Kim
-----------------
...
有办法吗?
我不确定你在c#中使用的是什么数据结构,但你可以在你的数据库中这样做:
SELECT COALESCE(Table1.ID, Table2.ID) AS ID
,COALESCE(Table1.Value, Table2.Value) AS Value
,COALESCE(Table1.Value2, Table2.Value2) AS Value2
FROM Table1
FULL OUTER JOIN Table2
ON Table1.ID = Table2.ID
我在这里选择了一个FULL OUTER JOIN,这样两边的项目都可以丢失(我通常期望大多数人在他们的职业生涯中大约每年使用一次FULL OUTER JOIN),以及一个任意的选择,总是选择表1中的值,如果它先存在,所以表2不会覆盖表1中的东西。
作为FOJ如何工作的一个例子:
Table 1
1,A,NULL
2,B,X
3,NULL,Y
4,D,Z
Table 2
1,NULL,P
2,NULL,Q
3,C,NULL
5,E,W
Output:
1,A,P
2,B,X
3,C,Y
4,D,Z
5,E,W
如果它们已经在datatable中,你可以将它们加载到另一个表中:
DataTable unionTable = new DataTable();
unionTable.Load(table1.CreateDataReader());
unionTable.Load(table2.CreateDataReader());
我认为前面提到的服务器端是更好的方法。
在Linq中有另一种方法
//假设你有两个表(从数据库中填充变量)IQueryable tab1 = new List().AsQueryable();IQueryable tab2 = new List().AsQueryable();
//你可以这样创建结果表var resultTable = tab1。Select(t1 => new Table1 {t1。ID、t1。价值,tab2。任意(t2 => t2)ID == t1.ID) ?tab2。首先(t2 => t2)ID == t1.ID)。