完全外部连接3在c#中使用Linq的DataTables

/ *请参阅我的问题的最后3行,以解释我的问题与建议的可能副本的不同之处。 * /

我试图用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.该问题地址加入列表不是数据表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的超类,或者一个接口。 不要忘记为此定义值相等。

添加评论后
其中一条评论表达了对表1 /表2和表3的初始化陈述的混淆。

在你的问题中,你展示了一个使用Table1,Table2,Table3的代码示例。 显然你已经声明并初始化了这些变量。 所以我确定你的代码中有一个地方:

var Table1 = ...

唯一的区别是我写道:

IEnumerable<Table1Element> Table1 = ...

我这样做是为了让其他代码更易读。 我将Table1的元素定义为Table1Element类型。 我认为如果你的Table1包含MyClass元素,你会知道我的代码中要替换什么。

添加结束

链接地址: http://www.djcxy.com/p/68839.html

上一篇: full outer join 3 DataTables using Linq in c#

下一篇: How to filter certain DataRows in a Data Table