C# 在c中使用Linq的完全外部联接3个数据表

C# 在c中使用Linq的完全外部联接3个数据表,c#,linq,datatable,C#,Linq,Datatable,/*请参阅问题的最后3行,了解我对问题与建议的可能重复问题的不同之处的解释*/ 我正在尝试使用Linq将3个数据表连接在一起 假设DataTable的名称是table1、table2和table3 假设每个数据表有6列,列名是col1、col2、col3、col4、col5和col6 我想在col1、col2、col3和col4匹配的地方加入这些表 我想将表2和表3中的第5列和第6列附加到表1中,从而得到一个表4,其中有10列,如果不匹配,则所有记录是否匹配或不为null 我早上大部分时间都在研

/*请参阅问题的最后3行,了解我对问题与建议的可能重复问题的不同之处的解释*/

我正在尝试使用Linq将3个数据表连接在一起

假设DataTable的名称是table1、table2和table3 假设每个数据表有6列,列名是col1、col2、col3、col4、col5和col6

我想在col1、col2、col3和col4匹配的地方加入这些表

我想将表2和表3中的第5列和第6列附加到表1中,从而得到一个表4,其中有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,代码将类似

使用查询语法编写三个表上的连接比使用方法语法编写更容易。在这里,您将看到如何使用方法语法在三个表上编写联接

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,
    }
}
唯一不同的是我写了:

IEnumerable<Table1Element> Table1 = ...
我这样做是为了使代码的其余部分更具可读性。我将Table1的元素定义为Table1Element类型。我假设,如果您的Table1包含MyClass的元素,您就会知道在我的代码中替换什么


添加结束

可能重复@mjwills nope这是我第一次看到的,它是连接列表,也只在一列上连接为什么不使用sql,哪一个更简单?标记为重复中的第二个答案具有通用的完全外部联接实现,它也是MoreLINQ的一部分,可用于数据表和多个键。这非常有用。但是什么是。。。在代码的以下部分:IEnumerable Table1=…我没有用变量声明这两个表,它们是datatables。也许我应该这样做,而不是创建datatables。我似乎无法理解这一点
IEnumerable<Table1Element> Table1 = ...