繁体   English   中英

在C#中使用Linq进行完全外部联接3数据表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM