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();
你可以试试 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
我有以下两个示例数据表,它们显示了从数据库加载的数据:
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();
你可以试试 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