[英]full outer join 3 DataTables using Linq in c#
/ *请参阅问题的后三行,以解释问题与建议的重复内容有何不同。 * /
我正在尝试使用Linq将3个DataTables连接在一起。
假设DataTable的名称为table1,table2和table3,假设每个Datatable有6列,而列的名称为col1,col2,col3,col4,col5和col6。
我想加入col1,col2,col3和col4匹配的这些表。
我想将表2和3的第5列和第6列追加到table1,导致一个table4包含10列并且所有记录是否匹配(如果不匹配则为null)。
我在整个上午的大部分时间里都在研究,似乎无法绕过它。 我本想尝试下面的代码,但我认为这样做只会使人们感到困惑。 预先感谢您的任何帮助。 我希望我提供了足够的信息。
编辑:我要把我的尝试放在下面的代码。 我什至无法加入任何工作,更不用说所有表格了:
var table4 = from one in Table1 join two in Table2 on one.col1 equals two.col1, one.col2 equals two.col2, one.col3 equals two.col3, one.col4 equals two.col4
select new { one.col1, two.col1, one.col2, two.col2, one.col3,two.col3,one.col4,two.col4};
由于以下原因,我的问题与建议的重复项不同:1.该问题解决了联接列表而不是DataTables 2.该问题解决了基于匹配一列而不是多个列的联接问题
我不确定您使用的是IEnumerable还是IQueryable,代码是否相似。
用查询语法编写时,对三个表的联接比用方法语法编写时更容易。 请参阅如何在LINQ lambda中执行多个表之间的联接。您将看到如何在方法语法中的三个表上编写联接 。
IEnumerable<Table1Element> Table1 = ...
IEnumerable<Table2Element> Table2 = ...
IEnumerable<Table3Element> Table3 = ...
from table1Element in Table1
join table2Element in Table2
on new
{
Col1 = table1Element.Col1,
Col2 = table1Element.Col2,
Col3 = table1Element.Col3,
Col4 = table1Element.Col4,
}
equals new
{
Col1 = table2Element.Col1,
Col2 = table2Element.Col2,
Col3 = table2Element.Col3,
Col4 = table2Element.Col4,
}
join table3Element in Table3
on new
{
Col1 = table2Element.Col1,
Col2 = table2Element.Col2,
Col3 = table2Element.Col3,
Col4 = table2Element.Col4,
}
equals new
{
Col1 = table3Element.Col1,
Col2 = table3Element.Col2,
Col3 = table3Element.Col3,
Col4 = table3Element.Col4,
}
select new
{
Col1 = table1Element.Col1,
Col2 = table1Element.Col2,
Col3 = table1Element.Col3,
Col4 = table1Element.Col4,
// only if required: col5 and col6 from table1
FromTable1 = new
{
Col5 = table1Element.Col5,
Col6 = table1Element.Col6,
}
FromTable2 = new
{
Col5 = table2Element.Col5,
Col6 = table2Element.Col6,
}
FromTable3 = new
{
Col5 = table3Element.Col5,
Col6 = table3Element.Col6,
}
}
我在这里使用匿名类型。 匿名类型的优点之一是它们使用按值相等而不是按引用相等。 因此,它们非常适合在多个字段上执行联接。 请参阅: 匿名类型的喜悦
如果您经常进行这些连接,请考虑创建一个包含Col1..Col4或接口的超类。 不要忘记为此定义值相等。
评论后添加
其中一条评论对Table1 / Table2和Table3的初始化语句表示混乱。
在您的问题中,您展示了一个代码示例,其中使用了Table1,Table2,Table3。 显然,您已经声明并初始化了这些变量。 因此,我可以肯定您的代码中的某处:
var Table1 = ...
唯一的区别是我写了:
IEnumerable<Table1Element> Table1 = ...
我这样做是为了使其余代码更具可读性。 我将Table1
的元素定义为Table1Element
类型。 我假设,如果您的Table1
包含MyClass
元素,您将知道在我的代码中要替换的内容。
添加结束
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.