C# LINQ 使用公共字段连接两个数据表

C# LINQ join two DataTables with a common field

我有以下两个示例数据表,它们显示了从数据库加载的数据:

              table1:                                 table2:
| pk |groupID|cField|field1|field2|    | pk |groupID|cField|field1|field2|
|----|-------|------|------|------|    |----|-------|------|------|------|
| 1  |   1   | 0.5  |  10  |    |    | 10 |   1   | 0.5  |  20  |   |
| 2  |   1   |  1   |  10  |   |    | 11 |   1   |  1   |  20  |   |
| 3  |   1   |  2   |  10  |   |    | 12 |   1   |  2   |  20  |   |
| 4  |   1   |  5   |  10  |   |    | 13 |   1   |  5   |  20  | 0 |                           


The expected result would be (dtAux):

|groupID|cField|t1_field1|t1_field2|t2_field1|t2_field2|
|-------|------|---------|---------|---------|---------|
|   1   | 0.5  |    10   |       |    20   |      |
|   1   |  1   |    10   |      |    20   |      |
|   1   |  2   |    10   |      |    20   |      |
|   1   |  5   |    10   |      |    20   |   0  |

基于this other post,我尝试了以下代码:

dtAux = new DataTable();
dtAux.Columns.Add("groupID"); 
dtAux.Columns.Add("cField"); 
dtAux.Columns.Add("t1_field1"); 
dtAux.Columns.Add("t1_field2"); 
dtAux.Columns.Add("t2_field1"); 
dtAux.Columns.Add("t2_field2");

IEnumerable<DataRow> qry = from t1 in table1.AsEnumerable() join t2 in table2.AsEnumerable()
                           on t1.Field<float>("cField") equals t2.Field<float>("cField")
                           where t1.Field<int>("groupID") == 1
                           select dtAux.LoadDataRow(new Object[] {
                                 t1.Field<int>("groupID"), t1.Field<float>("cField"),                                                                    
                                 t1.Field<int>("field1"), t1.Field<decimal>("field2"),                                                                   
                                 t2.Field<int>("field1"), t2.Field<decimal>("field2")
                           }, false);

然而,它 returns 是一个空的 table。非常感谢任何提示或帮助。

qry没有执行。您需要 .CopyToDataTable() 才能执行它。

qry.CopyToDataTable();

Sample program

你可以试试 Zip。

var table1 = new [] {
    new { pk = 1, groupID = 1, field2 = 5 },
    new { pk = 2, groupID = 1, field2 = 10 }
};

var table2   = new [] {
    new { pk = 10, groupID = 1, field2 = 10 },
    new { pk = 11, groupID = 1, field2 = 20 }
};

var table3 = table1.Zip(
    second: table2, 
    resultSelector: (t1, t2) => new { t1_field2 = t1.field2, t2_field2 = t2.field2});

foreach(var t3 in table3 )
{
    Console.WriteLine($"{t3.t1_field2}, {t3.t2_field2}");
}

这会打印:

5, 10
10, 20